如何从lParam读取数据(指针值)

时间:2013-07-05 09:58:21

标签: winapi callback

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

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

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

由于

3 个答案:

答案 0 :(得分: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, ...), 

答案 1 :(得分:2)

您的GetMsgProc() callback编码错误。仔细阅读链接的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。

答案 2 :(得分: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;
}