0

我想检测每次我粘贴的东西。这只是使某些数据输入工作更简单的东西。我设置了一个全局钩子,然后“等待”wm_paste。这是我拥有的代码的一部分:

LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode < 0)//Do not process the message
        return CallNextHookEx(msg_hook,nCode,wParam,lParam);

    LPMSG m=(LPMSG)lParam;

    if(m->message == WM_PASTE)
    {
        OutputString("Paste detected!\n");
    }
    if(m->message == WM_PASTE)
    {
        OutputString("Paste detected!\n");
    }


    return CallNextHookEx(msg_hook,nCode,wParam,lParam);
    }





//DLL_ATTACH:
...
if(strstr(ProcName, LOADERNAME))
        {
            InitCommonControls();

            if(!(msg_hook=SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, hinstDLL, 0)))
            {
                ErrorExit(TEXT("SetWindowsHookEx"));
                //MessageBox(0, "WH_GETMESSAGE", 0, 0);
                //return -1;
            }
        }

WM_PASTE 调试字符串永远不会被打印。我知道并非所有应用程序都使用 WM_PASTE。但至少记事本应该可以工作。

有什么建议么?谢谢!

4

2 回答 2

2

GetMsgProc中,wParam参数不是被拦截的消息,而是一个标志,指示消息是否在消息队列中lParam并从消息队列中删除。

你应该m->wParam改用。

于 2012-09-09T02:02:23.330 回答
1

Wm_paste 消息仅在组合框和编辑控件中触发。没有简单的方法来捕获粘贴,但是您可以通过创建一个小窗口并将此窗口添加到剪贴板查看器链来获取复制消息。

于 2013-02-19T19:30:58.513 回答