キーボード フック内のキーボード レイアウトの変更に問題があります。この単純なコードでは、「A」キーを押すと、言語を変更するのに多くの時間がかかり、より複雑なケースでは、アプリケーションが間違ったことをします..
アプリケーションはトレイで動作するため、フックを使用しました。私のコードの何が問題なのですか? )) または、フックでうまく機能するキーボードレイアウトを変更する別の方法があるのでしょうか? 回答ありがとうございます。
private static bool nextKey = false;
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) {
uint tpid = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero);
ushort currentLayout = GetKeyboardLayout(tpid);
if (nCode >= 0 && wParam == (IntPtr) WM_KEYDOWN) {
if (nextKey) {
Console.WriteLine("changing to english...");
PostMessage(GetForegroundWindow(), 0x0050, 0, (int) LoadKeyboardLayout("00000409", 0x00000001));
nextKey = false;
}
int vkCode = Marshal.ReadInt32(lParam);
if (vkCode == 0x41 && currentLayout == 0x409) { // if language is rus and 'A' pressed
Console.WriteLine("changing to russian...");
PostMessage(GetForegroundWindow(), 0x0050, 0, (int) LoadKeyboardLayout("00000419", 0x00000001));
nextKey = true;
}
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}