更改其他进程的键盘布局

我正在用C#编写一个在后台运行的程序,并允许用户使用热键在活动窗口中切换键盘布局。 (Windows仅支持CTRL + SHIFTALT + SHIFT

我正在使用RegisterHotKey来捕获热键,它运行正常。

问题是我找不到任何API来改变聚焦窗口的键盘布局。

ActivateKeyboardLayout和LoadKeyboardLayout只能更改调用线程的键盘布局。

有谁知道如何更改不同线程的键盘布局(语言栏的方式)?

如果您正在为自己编写一些内容,则可以接受另一种方法:为每个布局定义单独的组合键(例如Alt + Shift + 1等),并使用SendInput在它们之间切换。

当然可以使用这种情况。

PostMessage(handle, WM_INPUTLANGCHANGEREQUEST, 0, LoadKeyboardLayout( StrCopy(Layout,'00000419'), KLF_ACTIVATE) ); 

我认为诀窍是让您的代码在您希望更改其键盘布局的线程的上下文中执行。 你需要在这里做一些win32互操作,并了解DLL注入以使你的代码在远程线程中执行。

键盘钩子处理程序在这里看起来是个不错的选择。

请查看http://www.codeproject.com/KB/threads/winspy.aspx

  function ChangeRemoteWndKeyboardLayoutToRussian( const RemoteHandle: THandle): Boolean; var Dumme: DWORD; Layout: HKL; begin Layout := LoadKeyboardLayout('00000419', KLF_ACTIVATE); Result := SendMessageTimeOut(RemoteHandle, WM_INPUTLANGCHANGEREQUEST, 0, Layout, SMTO_ABORTIFHUNG, 200, Dumme) <> 0; if Result then Result := SendMessageTimeOut(RemoteHandle, WM_INPUTLANGCHANGEREQUEST, RUSSIAN_CHARSET, Layout, SMTO_ABORTIFHUNG, 200, Dumme) <> 0; end;