【问题标题】:Find out when keyboard layout is changed找出何时更改键盘布局
【发布时间】:2023-03-09 21:00:01
【问题描述】:

我正在编写屏幕键盘,并希望在更改键盘布局后立即重新绘制布局。

目前我打电话:

GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL));

在每次按键时查看布局是否已更改。如果用户通过鼠标更改布局,则它不起作用,直到按下键。

我想知道是否有任何方法可以得到通知 当当前前台窗口的键盘布局改变时, 这样我就可以在更改发生后立即重新绘制布局。

【问题讨论】:

    标签: c# .net windows keyboard keyboard-layout


    【解决方案1】:

    有办法...

    首先您需要注册您的应用程序以捕获前台窗口更改:
    使用SetWinEventHookEVENT_SYSTEM_FOREGROUND (以及WINEVENT_OUTOFCONTEXT,因为它是.NET)

    如果发生这种情况:使用您的 GetKeyboardLayout 解决方案获取该窗口的当前布局。

    然后使用本地 Windows Hook(您可能在低级别全局使用它来捕获键)WH_CALLWNDPROC 和新前台窗口的线程。
    收听该窗口的 WM_INPUTLANGCHANGE 消息以接收对布局的更改。
    (您可能希望在另一个前台更改后取消挂钩/重新挂钩)

    【讨论】:

      【解决方案2】:

      看起来键盘布局存储在这里: HKEY_CURRENT_USER\键盘布局\预加载

      当我更改键盘语言时,那里的设置顺序发生了变化。

      因此您可以监控注册表项。这是一种方法:

      http://www.codeproject.com/KB/system/registrymonitor.aspx

      【讨论】:

      • 仅当您更改默认键盘布局或添加新键盘布局时,HKEY_CURRENT_USER\Keyboard Layout\Preload 中的值顺序才会更改
      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 2021-10-03
      • 2012-12-20
      • 2018-10-03
      • 1970-01-01
      相关资源
      最近更新 更多