我有两个创建键盘输入的设备,其中一个是真实的键盘,另一个使用SendInput()发送注入的键盘输入。我正在修改一个现有的程序,该程序使用钩子将键盘消息仅发送到其自己的窗口,并全局阻止其他程序的输入。但是,我不想阻止Injected输入,也不想让程序处理Injected输入。
我使用WH_KEYBOARD_LL钩子确定输入是否被注入,然后使用全局WH_KEYBOARD钩子将消息仅发送到窗口(如果它是真实的键盘)。我正在寻找的是一种向主窗口以外的所有内容发送sendMessage()的方法。尽管我在文档中找不到执行此操作的方法,所以我决定将钩子传递的更远。
// WH_KEYBOARD
static LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) {
if (code < 0) {
return CallNextHookEx(hookHandle, code, wParam, lParam);
}
//Report the event to the main window, but do not pass it to the hook chain
if (realKeyboard) {
SendMessage(hwndServer, WM_HOOK, wParam, lParam);//only listen to real keyboard, block emulated one
}
else {
//what i want is to sendMessage to everythng except the main window
return CallNextHookEx(hookHandle, code, wParam, lParam); //let injected keyboard passthrough
//however we want to ignore injected inputs in the main window(keyboard program).
}
return 1;
}
我使用GetCurrentThreadId()创建了一个本地WH_GETMESSAGE挂钩,以查看是否可以忽略那里的注入输入。
// WH_GETMESSAGE
static LRESULT CALLBACK GetMessageProc(int code, WPARAM wParam, LPARAM lParam) {
if (code < 0) {
return CallNextHookEx(hookHandle, code, wParam, lParam);
}
if (!realKeyboard) {
MSG * info = (MSG *)lParam;
info->message = WM_NULL;
}
return CallNextHookEx(hookHandle, code, wParam, lParam);
}
我在某处读到了info-> message = WM_NULL;可以阻止该消息,但似乎没有效果。我也尝试过创建一个类似这样的消息循环,但是它也不起作用。
while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
if(IsRealKeyboard()){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
任何想法,我如何只能在主窗口中忽略注入的消息,然后将其传递到系统的其余部分?
您可以在目标窗口中使用RAW INPUT并处理WM_INPUT
消息,然后通过GetRawInputData
获取原始输入缓冲区。