1

我制作了一个小型应用程序,通过 SendMessage 和 EM_REPLACESEL 将文本发送到记事本。

现在我正在尝试连接记事本以获取 EM_REPLACESEL 值(lParam 值,在本例中为“GET THIS TEXT”文本)。

图片来自 Spy++

编辑:见这张照片:http: //i.stack.imgur.com/8scNL.jpg

钩子工作正常,我的问题是监听 EM_REPLACESEL 消息并从 lParam 中获取值。

当消息发送到记事本时,此代码工作正常:

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

所以现在我想拦截 EM_REPLACESEL 消息。这不起作用

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

1) 如何监听 EM_REPLACESEL 消息?

2) 当我收到消息时,如何获取 lParam 值,例如在 MessageBox 中显示它。像这样的东西:

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

谢谢

4

3 回答 3

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, ...), 
于 2013-07-05T17:49:46.900 回答
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。

于 2013-07-05T10:54:37.093 回答
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;
}
于 2013-07-05T12:00:48.287 回答