C# 更改其他进程的键盘布局
我正在用C语言编写一个程序,它在后台运行,允许用户使用热键在活动窗口中切换键盘布局。(Windows仅支持CTRL+SHIFT和ALT+SHIFT) 我正在使用RegisterHotKey捕捉热键,它工作正常 问题是我找不到任何API来更改聚焦窗口的键盘布局 ActivateKeyboardLayout和LoadKeyboardLayout只能更改调用线程的键盘布局C# 更改其他进程的键盘布局,c#,.net,winapi,keyboard-layout,registerhotkey,C#,.net,Winapi,Keyboard Layout,Registerhotkey,我正在用C语言编写一个程序,它在后台运行,允许用户使用热键在活动窗口中切换键盘布局。(Windows仅支持CTRL+SHIFT和ALT+SHIFT) 我正在使用RegisterHotKey捕捉热键,它工作正常 问题是我找不到任何API来更改聚焦窗口的键盘布局 ActivateKeyboardLayout和LoadKeyboardLayout只能更改调用线程的键盘布局 有没有人知道如何更改不同线程的键盘布局(就像语言栏那样)?我认为关键在于让代码在要更改其键盘布局的线程的上下文中执行。您需要在这里
有没有人知道如何更改不同线程的键盘布局(就像语言栏那样)?我认为关键在于让代码在要更改其键盘布局的线程的上下文中执行。您需要在这里执行一些win32互操作,并了解DLL注入,以使代码在远程线程中执行 A看起来对你来说是个不错的选择 看看
如果你只是为自己写东西,另一种方法可能是可以接受的:为每个布局定义一个单独的组合键(如Alt+Shift+1等),并使用在它们之间切换 当然,此功能可用的环境是有限的。
函数更改RemoteWndKeyboardLayoutOrussian(
PostMessage(handle,
WM_INPUTLANGCHANGEREQUEST,
0,
LoadKeyboardLayout( StrCopy(Layout,'00000419'), KLF_ACTIVATE)
);
常量RemoteHandle:THandle):布尔值;
变量
杜姆:德沃德;
布局:港岛线;;
开始
布局:=加载键盘布局('00000419',KLF_激活);
结果:=SendMessageTimeOut(RemoteHandle、WM_INPUTLANGCHANGEREQUEST、,
0,布局,SMTO_-Fhung,200,Dumme)0;
如果结果是这样的话
结果:=SendMessageTimeOut(RemoteHandle、WM_INPUTLANGCHANGEREQUEST、,
俄文字符集,布局,SMTO字符集,200,达姆)0;
结束;
当您使用windows内置热键切换语言时,不会影响不同的线程,是吗?每个线程键盘布局切换?相对于系统范围的布局切换?用和弦做点什么?@drachenstern:没有系统范围的键盘布局切换;活动键盘布局是每个UI线程的状态。我试图替换Alt+Shift,这样我就不会意外按下它,所以和弦不是一个选项(如果我理解你的意思的话)。我想你知道我在和弦上的意思。我只是觉得键盘布局是从系统继承来的,我很好奇为什么每个线程都要覆盖它。为什么不在线程上使用与系统上相同的布局?这就是我所好奇的。我想,只是想了解更多的观察世界的方式。对于句柄
,使用GetForeGroundIndow
可以很好地实现这一点。一个例外是WPF程序,它似乎在响应此消息时被锁定。@RomanStarkov如何找到受影响的WPF版本以及原因是什么?@Dims我都不知道。我不知道原因是否与此有关(但这无助于你解决问题)
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;