我正在嘗試用 C( ) 為我的可雙擊的蹩腳鍵盤撰寫一個鍵盤軟體去抖程式。
我顯然需要為 WM_KEYBOARD_LL 設定一個掛鉤,但我 a) 做不到,我有“無效句柄”錯誤,并且 b) 不知道如何取消按鍵,因為我也想為游戲這樣做。
我將如何正確實施這一點?
提前致謝!
編輯:這是我在某處找到的非作業代碼
#include "windows.h"
#include <iostream>
using namespace std;
HHOOK hookHandle;
LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam);
int main(int argc, char *argv[])
{
hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, keyHandler, NULL, 0);
if (hookHandle == NULL)
{
cout << "ERROR CREATING HOOK: ";
cout << GetLastError() << endl;
getchar();
return 0;
}
MSG message;
while (GetMessage(&message, NULL, 0, 0) != 0)
{
TranslateMessage(&message);
DispatchMessage(&message);
}
cout << "Press any key to quit...";
getchar();
UnhookWindowsHookEx(hookHandle);
return 0;
}
LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam)
{
cout << "Hello!" << endl;
// Checks whether params contain action about keystroke
if (nCode == HC_ACTION)
{
cout << ((KBDLLHOOKSTRUCT *)lParam)->vkCode << endl;
}
return CallNextHookEx(hookHandle, nCode,
wParam, lParam);
}
我在 Linux 上使用 Mingw-W64 編譯它,但在 Windows 上的 MSVC 和 Mingw-W64 上重現錯誤。
uj5u.com熱心網友回復:
我顯然需要為 WM_KEYBOARD_LL 設定一個鉤子,但我......做不到,我有“無效句柄”錯誤
根據SetWindowsHookEx()檔案:
如果引數為 NULL 且引數為零或指定另一個行程創建的執行緒的識別符號,則
hModdwThreadId可能會發生錯誤。
這正是您正在做的事情。
因此,如果您的目標是全域掛鉤每個正在運行的行程(即dwThreadId=0),則需要將非 NULL 傳遞HMODULE給hMod引數。不需要將低級掛鉤實作為 DLL,因此您應該能夠使用該GetModuleHandle()函式(例如,使用其中一個lpModuleName=NULL或lpModuleName="kernel32.dll"應該就足夠了)。
[我]不知道如何取消按鍵
根據LowLevelKeyboardProc檔案:
回傳值
...
如果nCode大于等于0,并且hook程序沒有處理該訊息,強烈建議呼叫CallNextHookEx并回傳它回傳的值;否則,其他已安裝 WH_KEYBOARD_LL 掛鉤的應用程式將不會收到掛鉤通知,因此可能會出現錯誤行為。如果鉤子程序處理了訊息,它可能會回傳一個非零值,以防止系統將訊息傳遞給鉤子鏈的其余部分或目標視窗程序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/438368.html
上一篇:捕獲子行程的OpenGL輸出?
