我正在用 C# 编写一个在后台运行的程序,它允许用户使用热键在活动窗口中切换键盘布局。(Windows 仅支持CTRL+SHIFT和ALT+ SHIFT)
我正在使用 RegisterHotKey 来捕捉热键,它工作正常。
问题是我找不到任何 API 来更改焦点窗口的键盘布局。
ActivateKeyboardLayout 和 LoadKeyboardLayout 只能更改调用线程的键盘布局。
有谁知道如何更改不同线程的键盘布局(语言栏的方式)?
我正在用 C# 编写一个在后台运行的程序,它允许用户使用热键在活动窗口中切换键盘布局。(Windows 仅支持CTRL+SHIFT和ALT+ SHIFT)
我正在使用 RegisterHotKey 来捕捉热键,它工作正常。
问题是我找不到任何 API 来更改焦点窗口的键盘布局。
ActivateKeyboardLayout 和 LoadKeyboardLayout 只能更改调用线程的键盘布局。
有谁知道如何更改不同线程的键盘布局(语言栏的方式)?
PostMessage(handle,
WM_INPUTLANGCHANGEREQUEST,
0,
LoadKeyboardLayout( StrCopy(Layout,'00000419'), KLF_ACTIVATE)
);
我认为诀窍是让您的代码在您希望更改其键盘布局的线程的上下文中执行。您需要在此处进行一些 win32 互操作并了解 DLL 注入以使您的代码在远程线程中执行。
在这里,键盘挂钩处理程序对您来说是个不错的选择。
如果您只是为自己编写一些东西,另一种可能是可以接受的方式:为每个布局定义一个单独的组合键(例如 Alt+Shift+1 等),并使用SendInput在它们之间切换。
当然,它可用的情况是有限的。
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;