找出键盘布局何时被更改

12

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

目前我调用的是:

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

在每次按键时检查布局是否已更改。如果用户通过鼠标更改布局,则此方法无效,直到按键被按下。

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

2个回答

11

有一种方法可以在Windows操作系统中获取当前激活窗口的键盘布局。

首先,您需要注册应用程序以捕获前台窗口更改:
为此,请使用SetWinEventHookEVENT_SYSTEM_FOREGROUND (并将其设置为.NET的WINEVENT_OUTOFCONTEXT

如果发生这种情况:使用GetKeyboardLayout函数获取该窗口的当前布局。

然后,使用本地Windows钩子 (您可能会在低级全局键捕获方面使用它)与新前台窗口的线程一起使用WH_CALLWNDPROC
监听该窗口的WM_INPUTLANGCHANGE消息以接收布局更改。
(您可能需要在另一个前台更改之后取消钩子/重新钩子)


0

HKEY_CURRENT_USER\Keyboard Layout\Preload 中值的顺序只有在更改默认键盘布局或添加新的键盘布局时才会更改。 - Nejchy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接