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

Refresh

December 2018

Views

1.7k time

1

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: http://i.stack.imgur.com/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

3 answers

3

EM_REPLACESELэто было отправлено сообщение, не отправленное сообщение, так что вы должны использовать WH_CALLWNDPROCкрюк вместо WH_GETMESSAGEкрючка, например:

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, ...), 
0

Это, как я обычно делаю это.

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;
}
2

Ваш GetMsgProc () обратного вызова кодируется неправильно. Внимательно прочитайте связанную страницу MSDN , чтобы увидеть , что аргументы функции обратного вызова в виду. NCode аргумент не номер сообщения, оно определяет , следует ли вы обработать сообщение. Вы хотите использовать переданный LPARAM восстановить сообщение , которое вы перехватили. Сделать это выглядеть так , вместо этого:

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);
}

Обратите внимание, что вы появляетесь использовать WH_GETMESSAGE крючок. Он работает только для сообщений, отправленных в очередь сообщений с PostMessage (). Но EM_REPLACESEL это сообщение, которое послал с SendMessage (). Это требует другой крючок, WH_CALLWNDPROC или WH_CALLWNDPROCRET.