Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改其他进程的键盘布局_C#_.net_Winapi_Keyboard Layout_Registerhotkey - Fatal编程技术网

C# 更改其他进程的键盘布局

C# 更改其他进程的键盘布局,c#,.net,winapi,keyboard-layout,registerhotkey,C#,.net,Winapi,Keyboard Layout,Registerhotkey,我正在用C语言编写一个程序,它在后台运行,允许用户使用热键在活动窗口中切换键盘布局。(Windows仅支持CTRL+SHIFT和ALT+SHIFT) 我正在使用RegisterHotKey捕捉热键,它工作正常 问题是我找不到任何API来更改聚焦窗口的键盘布局 ActivateKeyboardLayout和LoadKeyboardLayout只能更改调用线程的键盘布局 有没有人知道如何更改不同线程的键盘布局(就像语言栏那样)?我认为关键在于让代码在要更改其键盘布局的线程的上下文中执行。您需要在这里

我正在用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;