我想要一個鍵盤鉤子來捕獲用戶的所有輸入并將其轉換為 unicode 字符。使用以下代碼可以作業,但前提是我呼叫了下一個鉤子。否則,盡管按下 shift,但字母總是列印得很小。
我已經查看了鍵盤狀態,如果我“吃掉”按鍵,它似乎不會更新。
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
if(nCode < 0) return CallNextHookEx(hook, nCode, wParam, lParam);
KBDLLHOOKSTRUCT* keystruct = (KBDLLHOOKSTRUCT*)lParam;
WCHAR uc[5] = { 0 };
BYTE kb[256];
GetKeyboardState(kb);
if (wParam == WM_SYSKEYDOWN || wParam == WM_KEYDOWN) {
int res = ToUnicode(keystruct->vkCode, keystruct->scanCode, kb, uc, 4, 0);
switch (res) {
case -1:
// code for handling dead keys has been removed for simplicity
break;
case 0:
break;
case 1:
case 2:
case 3:
case 4: {
wcout << uc;
}
}
}
// eat keystroke
return 1;
// dont eat keystroke
return CallNextHookEx(hook, nCode, wParam, lParam);
}
我不知道是否有正確的方法來“吃”擊鍵并且仍然相應地更新鍵盤狀態。
我什至嘗試在吃掉按鍵并回傳 1 之前自己更新鍵盤狀態:
#define BIT_SET(a,b) ((a) |= (1ULL<<(b)))
#define BIT_CLEAR(a,b) ((a) &= ~(1ULL<<(b)))
#define BIT_FLIP(a,b) ((a) ^= (1ULL<<(b)))
#define BIT_CHECK(a,b) (!!((a) & (1ULL<<(b))))
// if key down
if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) {
// and the key was not down previously
if (!BIT_CHECK(kb[keystruct->vkCode], 7)) {
// switch the toggled state by setting the low-order bit (https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getkeystate)
if (BIT_CHECK(kb[keystruct->vkCode], 0)) BIT_CLEAR(kb[keystruct->vkCode], 0);
else BIT_SET(kb[keystruct->vkCode], 0);
}
// mark key as down by setting the high-order bit
BIT_SET(kb[keystruct->vkCode], 7);
}
else {
// else clear the bit so mark as not down
BIT_CLEAR(kb[keystruct->vkCode], 7);
}
// update the keyboard state manually
SetKeyboardState(kb);
這仍然給出了相同的結果。
有沒有辦法“吃掉”擊鍵并保持鍵盤狀態最新/讓 ToUnicode 仍然按預期作業?
uj5u.com熱心網友回復:
所以事實證明,設定鍵盤狀態并手動調整它是有效的。唯一的問題是 ToUnicode 忽略了 LSHIFT、RSHIFT、LCONTROL、RCONTROL 等。所以我只是將這些鍵映射到它們等效的 SHIFT、CONTROL、MENU,現在一切正常。
uj5u.com熱心網友回復:
根據檔案:ToUnicodeEx 函式
您應該提供一個指向包含當前鍵盤狀態 (const BYTE *lpKeyState) 的 256 位元組陣列的指標。陣列中的每個元素(位元組)都包含一個鍵的狀態。如果設定了位元組的高位,則密鑰關閉。
要檢索單個密鑰的狀態資訊,請使用 GetKeyState 函式。
就我而言,您可以嘗試向緩沖區添加一個額外的索引。
BYTE state[256] = { 0 };
GetKeyState(VK_SHIFT);
GetKeyState(VK_CONTROL);
GetKeyState(VK_MENU);
GetKeyboardState(kb);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/386828.html
上一篇:C 如何設定像素顏色
