我正在编写一个屏幕键盘,希望在键盘布局更改后立即重新绘制我的布局。
目前我调用的是:
GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL));
在每次按键时检查布局是否已更改。如果用户通过鼠标更改布局,则此方法无效,直到按键被按下。
我想知道是否有任何方法可以在当前前台窗口的键盘布局更改时得到通知,以便在更改发生时立即重新绘制我的布局。
我正在编写一个屏幕键盘,希望在键盘布局更改后立即重新绘制我的布局。
目前我调用的是:
GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL));
在每次按键时检查布局是否已更改。如果用户通过鼠标更改布局,则此方法无效,直到按键被按下。
我想知道是否有任何方法可以在当前前台窗口的键盘布局更改时得到通知,以便在更改发生时立即重新绘制我的布局。
有一种方法可以在Windows操作系统中获取当前激活窗口的键盘布局。
首先,您需要注册应用程序以捕获前台窗口更改:
为此,请使用SetWinEventHook
和EVENT_SYSTEM_FOREGROUND
(并将其设置为.NET的WINEVENT_OUTOFCONTEXT
)。
如果发生这种情况:使用GetKeyboardLayout
函数获取该窗口的当前布局。
然后,使用本地Windows钩子 (您可能会在低级全局键捕获方面使用它)与新前台窗口的线程一起使用WH_CALLWNDPROC
。
监听该窗口的WM_INPUTLANGCHANGE
消息以接收布局更改。
(您可能需要在另一个前台更改之后取消钩子/重新钩子)
看起来键盘布局存储在这里: HKEY_CURRENT_USER\Keyboard Layout\Preload
当我更改键盘语言时,设置的顺序也会改变。
因此,您可能可以监视注册表条目。以下是一种方法: