以下のコードで: - :SHIFT + 又はSHIFT + を押してもGetKeyStateがToUnicodeExの動作を変更したのはなぜですか?
KEY:a
KEY:b
KEY:2
-
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;
出力のみのような小文字を示します
Bu T以下のコードで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ファイルに使用し、コンソールアプリケーションにリンクしました。
だから私の質問は:なぜGetKeyState
機能が LockキーSHIFTとキャップの検出を可能に?また、
GetKeyState(:
は、より多くのこのような何かを試してみてください。キーボードの* buffered *状態、つまりキーが押されたときの状態を返します。アプリケーションがGetMessage()を呼び出すと更新され、コンソールモードのアプリケーションでは表示されません。しかし、それは時々更新されますが、正確なトリガーは決して私には明らかでした。 GetAsyncKeyState()で独自のキーボード状態を合成するか、何が動作するかを検討してください。 –