Theis Kristensen
Theis Kristensen

Reputation: 415

How to read the data from lParam (the pointers value)

I made a small application that sends text to notepad via SendMessage and EM_REPLACESEL.

Now I’m trying to hook notepad to get the EM_REPLACESEL value (the lParam value and in this case the “GET THIS TEXT” text).

Picture from Spy++

EDIT: See this picture: https://i.sstatic.net/8scNL.jpg

The hook works fine, my problem is to listen for the EM_REPLACESEL message and grab the value from the lParam.

This code works fine, when messages are sent to notepad:

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    Beep (2000,100);
    return(CallNextHookEx(g_hHook, nCode, wParam, lParam));
}

So now I want to intercept EM_REPLACESEL messages. This do not work:

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    if (nCode == EM_REPLACESEL)
    {
        Beep (2000,100);
    }
    return(CallNextHookEx(g_hHook, nCode, wParam, lParam));
}

1) How to listen for the EM_REPLACESEL message?

2) When I have gotten the message how to grab the lParam value and e.g. show it in a MessageBox. Something like this:

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    if (nCode == EM_REPLACESEL)
    {
        MSG *lpMsg;
        lpMsg = (MSG *) lParam;
        MessageBox(NULL,(LPCWSTR)lpMsg,NULL,NULL);
    }
    return(CallNextHookEx(g_hHook, nCode, wParam, lParam));
}

Thanks

Upvotes: 1

Views: 2650

Answers (3)

Remy Lebeau
Remy Lebeau

Reputation: 596602

EM_REPLACESEL is a sent message, not a posted message, so you need to use a WH_CALLWNDPROC hook instead of a WH_GETMESSAGE hook, eg:

LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    if (nCode == HC_ACTION) {
        CWPSTRUCT* cwps = (CWPSTRUCT*)lParam;
        if (cwps->message == EM_REPLACESEL) {
            Beep (2000,100);
            // etc..
        }
    }
    return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

... = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, ...), 

Upvotes: 3

Ayse
Ayse

Reputation: 2754

This is how I normally do it.

LRESULT CALLBACK GetMsgProc(MSG nCode, WPARAM wParam, LPARAM lParam) 
{
   while(GetMessage(&nCode, NULL, 0, 0) > 0)
   {
      if(nCode.message == EM_REPLACESEL)
      {
         //Do something
      }
      else
         DispatchMessage(&nCode);
   }
   return 0;
}

Upvotes: 0

Hans Passant
Hans Passant

Reputation: 941645

Your GetMsgProc() callback is coded wrong. Carefully read the linked MSDN page to see what the arguments of the callback mean. The nCode argument is not the message number, it specifies whether or not you should process the message. You want to use the passed lParam to recover the message that you intercepted. Make it look similar to this instead:

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    if (nCode == HC_ACTION) {
        MSG* pmsg = (MSG*)lParam;
        if (pmsg->message == WM_LBUTTONDOWN) {
            Beep (2000,100);
            // etc..
        }
    }
    return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

Do note that you appear to use the WH_GETMESSAGE hook. It only works for messages that are posted to the message queue with PostMessage(). But EM_REPLACESEL is a message that's sent with SendMessage(). That requires a different hook, WH_CALLWNDPROC or WH_CALLWNDPROCRET.

Upvotes: 2

Related Questions