如果 Windows 任务栏具有当前焦点,则 LoadKeyboardLayout() 无法更改键盘布局
LoadKeyboardLayout() fails to change Keyboard Layout if the Windows Taskbar has current focus
我正在使用全局热键以编程方式更改 Windows 中的键盘布局:
IntPtr fGWindow = GetForegroundWindow();
SendMessage(fGWindow.ToInt32(), WM_INPUTLANGCHANGEREQUEST_as_unit, IntPtr.Zero, LoadKeyboardLayout(LANG, KLF_SUBSTITUTE_OK));
除了我使用鼠标单击 Windows 任务栏(赋予它当前焦点)之外,代码工作正常。在那种情况下,消息已发送,但 LoadKeyboardLayout()
没有注意到。
使用 HWND_BROADCAST
而不是 GetForegroundWindow()
没有帮助。
更新/更多信息:
当我点击任务栏(给它焦点)时GetForegroundWindow()
获得的指针属于explorer.exe
。在那种情况下,代码不起作用。
这里是解决方法,如果当前前台window是系统托盘的话,基本上需要调整一下:
IntPtr shell_TrayWnd = FindWindow("Shell_TrayWnd", null);
if (fGWindow == shell_TrayWnd)
{
IntPtr vHandle = FindWindow("Progman", "Program Manager"); // Desktop Handler.
SetForegroundWindow(vHandle);
SendMessage(vHandle.ToInt32(), WM_INPUTLANGCHANGEREQUEST_as_unit, new IntPtr(-1), LoadKeyboardLayout(LANG, KLF_NOTELLSHELL));
}
我正在使用全局热键以编程方式更改 Windows 中的键盘布局:
IntPtr fGWindow = GetForegroundWindow();
SendMessage(fGWindow.ToInt32(), WM_INPUTLANGCHANGEREQUEST_as_unit, IntPtr.Zero, LoadKeyboardLayout(LANG, KLF_SUBSTITUTE_OK));
除了我使用鼠标单击 Windows 任务栏(赋予它当前焦点)之外,代码工作正常。在那种情况下,消息已发送,但 LoadKeyboardLayout()
没有注意到。
使用 HWND_BROADCAST
而不是 GetForegroundWindow()
没有帮助。
更新/更多信息:
当我点击任务栏(给它焦点)时GetForegroundWindow()
获得的指针属于explorer.exe
。在那种情况下,代码不起作用。
这里是解决方法,如果当前前台window是系统托盘的话,基本上需要调整一下:
IntPtr shell_TrayWnd = FindWindow("Shell_TrayWnd", null);
if (fGWindow == shell_TrayWnd)
{
IntPtr vHandle = FindWindow("Progman", "Program Manager"); // Desktop Handler.
SetForegroundWindow(vHandle);
SendMessage(vHandle.ToInt32(), WM_INPUTLANGCHANGEREQUEST_as_unit, new IntPtr(-1), LoadKeyboardLayout(LANG, KLF_NOTELLSHELL));
}