在下面的代碼: -爲什麼GetKeyState改變了ToUnicodeEx的行爲?
BYTE ks[256];
auto keyboard_layout = GetKeyboardLayout(0);
GetKeyboardState(ks);
auto w = WCHAR(malloc(1));
ToUnicodeEx(wParam, MapVirtualKey(wParam, MAPVK_VK_TO_VSC), ks, LPWSTR(&w), 1, 0, keyboard_layout);
wcout << "KEY:" << w << endl;
輸出僅示出了小寫字母,例如: -
KEY:a
KEY:b
KEY:2
按壓SHIFT + 甲或SHIFT即使 +
Bu噸在下面的代碼添加GetKeyState(VK_SHIFT)
和/或GetKeyState(VK_CAPITAL)
: - 壓制SHIFT當
auto shifted = false;
auto caps = false;
if (GetKeyState(VK_SHIFT) < 0)
{
shifted = true;
cout << "Shifted!" << endl;
}
if (GetKeyState(VK_CAPITAL) < 0)
{
shifted = true;
cout << "Caps!" << endl;
}
BYTE ks[256];
auto keyboard_layout = GetKeyboardLayout(0);
GetKeyboardState(ks);
auto w = WCHAR(malloc(1));
ToUnicodeEx(wParam, MapVirtualKey(wParam, MAPVK_VK_TO_VSC), ks, LPWSTR(&w), 1, 0, keyboard_layout);
wcout << "KEY:" << w << endl;
代碼的行爲直接更改 + 甲或SHIFT + 到
KEY:A
KEY:B
KEY:@
我在ToUnicode
,ToAsciiEx
和ToAscii
上試過這個,它們顯示t他和上面的情況一樣。
我在一個名爲hook.dll
的獨立DLL文件中使用了WH_KEYBOARD
鉤子,並與控制檯應用程序鏈接。
所以我的問題是:爲什麼GetKeyState
功能啓用SHIFT的檢測和大寫鎖定鍵?另外,
函數GetKeyState(不能在控制檯模式過程中可靠地工作。它返回鍵盤的* buffered *狀態,即鍵被按下時的狀態。當應用程序調用GetMessage()時,該控件模式應用程序不會更新。但它有時會更新,但確切的觸發對我來說從未明顯。考慮用GetAsyncKeyState()合成你自己的鍵盤狀態,或者做一下工作。 –