这是为我工作的WH_KEYBOARD_LL代码。
#include <Windows.h>
#include <iostream>
using namespace std;
HHOOK _hook;
KBDLLHOOKSTRUCT kbdStruct;
LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam) {
cout << nCode;
return CallNextHookEx(_hook, nCode, wParam, lParam);
}
void SetHook() {
if (!(_hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0))) {
cout << "SetWindowsHookEx Fail";
}
}
void ReleaseHook() {
UnhookWindowsHookEx(_hook);
}
int main() {
SetHook();
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
// do something here
}
return 0;
}但是,当我将SetWindowsHookEx行更改为if (!(_hook = SetWindowsHookEx(WH_KEYBOARD, HookCallback, NULL, GetCurrentThreadId())))时,它无法工作。
我有三个问题。
WH_KEYBOARD钩子工作?cout,则不会看到任何控制台输出。所以我很困惑,循环的主体执行了吗?GetMessage循环中,我应该添加一个对DispatchMessage的调用。DispatchMessage和CallNextHookEx有什么区别?我读了关于他们两个人的文件,但都听不懂。发布于 2017-09-17 06:02:24
根据回调函数文档:
与
SetWindowsHookEx函数一起使用的应用程序定义或库定义回调函数。每当应用程序调用GetMessage、message、或PeekMessage函数时,系统都会调用该函数,并且有一条键盘消息(**WM_KEYUP**或WM_KEYDOWN**)要处理**)。
您的WH_KEYBOARD回调不起作用,因为挂起的线程正在调用GetMessage(),但没有接收到任何WM_KEYUP或WM_KEYDOWN消息。这些是窗口消息,但您没有可视窗口可供张贴。
WH_KEYBOARD_LL钩子运行在较低的级别,因此它不需要挂起的线程调用(Get|Peek)Message()来接收窗口消息。根据回调函数文档:
与
SetWindowsHookEx函数一起使用的应用程序定义或库定义回调函数。每当一个新的键盘输入事件即将被提交到线程输入队列中时,系统就调用这个函数。。
https://stackoverflow.com/questions/46260845
复制相似问题