2008-11-04 100 views
13

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

我使用RegisterHotKey赶热键,并且它的正常工作。

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

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

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

+0

当您使用Windows的内置热键切换语言,它不会影响不同的线程,不是吗?每线程键盘布局切换 – JXG 2008-11-05 15:12:58

+0

?与全系统布局切换相反?用chording做什么? – jcolebrand 2010-11-01 17:13:45

+0

@drachenstern:没有系统范围内的键盘布局切换;活动键盘布局是每个UI线程状态。我正在尝试替换Alt + Shift,这样我就不会意外按下它,所以chording不是一个选项(如果我理解你的意思)。 – SLaks 2010-11-01 17:21:40

回答

1

另一种方式可能是,如果你正在写只是为了自己的东西可以接受的:定义一个单独的按键组合为每个布局(如ALT + SHIFT + 1等),和使用SendInput在它们之间切换。

这是可用的情况当然是有限的。

8
PostMessage(handle, 
    WM_INPUTLANGCHANGEREQUEST, 
    0, 
    LoadKeyboardLayout(StrCopy(Layout,'00000419'), KLF_ACTIVATE) 
); 
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;