更改其他进程的键盘布局

时间:2008-11-04 20:16:45

标签: c# .net winapi keyboard-layout registerhotkey

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

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

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

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

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

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:2)

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

keyboard hook handler对你来说似乎是个不错的选择。

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

答案 2 :(得分:1)

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

当然可以使用这种情况。

答案 3 :(得分:0)

  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;