我正在用C#编写一个程序,该程序在后台运行,并允许用户使用热键在活动窗口中切换键盘布局。 (仅适用于Windows支持CTRL + SHIFT 和 ALT + SHIFT )更改其他进程的键盘布局
我使用RegisterHotKey赶热键,并且它的正常工作。
问题是我找不到任何API来更改焦点窗口的键盘布局。
ActivateKeyboardLayout和LoadKeyboardLayout只能更改调用线程的键盘布局。
有谁知道如何更改不同线程的键盘布局(语言栏的方式)?
我正在用C#编写一个程序,该程序在后台运行,并允许用户使用热键在活动窗口中切换键盘布局。 (仅适用于Windows支持CTRL + SHIFT 和 ALT + SHIFT )更改其他进程的键盘布局
我使用RegisterHotKey赶热键,并且它的正常工作。
问题是我找不到任何API来更改焦点窗口的键盘布局。
ActivateKeyboardLayout和LoadKeyboardLayout只能更改调用线程的键盘布局。
有谁知道如何更改不同线程的键盘布局(语言栏的方式)?
另一种方式可能是,如果你正在写只是为了自己的东西可以接受的:定义一个单独的按键组合为每个布局(如ALT + SHIFT + 1等),和使用SendInput在它们之间切换。
这是可用的情况当然是有限的。
我认为诀窍就是让你的代码在你希望改变键盘布局的线程上下文中执行。您需要在这里执行一些win32 interop并了解DLL注入以让您的代码在远程线程中执行。
A keyboard hook handler在这里看起来是个不错的选择。
PostMessage(handle,
WM_INPUTLANGCHANGEREQUEST,
0,
LoadKeyboardLayout(StrCopy(Layout,'00000419'), KLF_ACTIVATE)
);
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;
当您使用Windows的内置热键切换语言,它不会影响不同的线程,不是吗?每线程键盘布局切换 – JXG 2008-11-05 15:12:58
?与全系统布局切换相反?用chording做什么? – jcolebrand 2010-11-01 17:13:45
@drachenstern:没有系统范围内的键盘布局切换;活动键盘布局是每个UI线程状态。我正在尝试替换Alt + Shift,这样我就不会意外按下它,所以chording不是一个选项(如果我理解你的意思)。 – SLaks 2010-11-01 17:21:40