2017-10-11 256 views
-3

我试图如在下面的代码中提到打印挂钩过程GetMsgProc内的消息来调用GetMsgPrc:无法使用WH_GETMESSAGE钩

LRESULT WINAPI GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    printf("inside hook proc"); 

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


void main() 
{ 
    HINSTANCE hins; 
    hins = GetModuleHandle(NULL); 
    getmsghook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC) GetMsgProc, hins, 0); 

    MSG message; 
    while (GetMessage(&message, NULL, 0, 0)) 
    { 
     TranslateMessage(&message); 
     DispatchMessage(&message); 
    } 

    UnhookWindowsHookEx(getmsghook); 
} 

// ---------- -------------------------------------------------

我的猜测是,对于每个键盘或鼠标输入,应该打印该消息。但我无法弄清楚为什么没有发生。能否请你帮忙。

+0

如果我没有记错,该钩子只捕获窗口句柄中的_sent_消息。 –

+0

@ 500-InternalServerError:不一定。如果我用WH_MOUSE_LL替换WH_GETMESSSAGE,它会起作用。 – Roger1990

+0

@ 500-InternalServerError。 'WH_GETMESSAGE'捕获通过'(Peek | Get)Message()'传递的任何消息,无论它是发布,发送,广播等。你可能会想'WH_CALLWNDPROC/RET',它捕获所有发送的消息到一个窗口。 –

回答

1

全局钩子必须在.DLL中实现,唯一的例外是低键盘键盘和鼠标钩子。检查返回值SetWindowsHookEx,它可能是NULL。