我正在编写一个屏幕键盘,并希望在更改键盘布局后立即重绘我的布局。
目前我打电话:
GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL));
每次按键以查看布局是否已更改。如果用户通过鼠标更改布局,则它不起作用,直到按下键。
我想知道当当前前台窗口的键盘布局发生变化时是否有任何方法可以得到通知,这样我就可以在发生变化后立即重绘我的布局。
我正在编写一个屏幕键盘,并希望在更改键盘布局后立即重绘我的布局。
目前我打电话:
GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL));
每次按键以查看布局是否已更改。如果用户通过鼠标更改布局,则它不起作用,直到按下键。
我想知道当当前前台窗口的键盘布局发生变化时是否有任何方法可以得到通知,这样我就可以在发生变化后立即重绘我的布局。
有一种方法 ...
首先,您需要注册您的应用程序以捕获前台窗口更改:为此
使用SetWinEventHook
with EVENT_SYSTEM_FOREGROUND
(并且WINEVENT_OUTOFCONTEXT
因为它是 .NET)。
如果发生这种情况:使用您的GetKeyboardLayout
解决方案获取该窗口的当前布局。
然后使用本地Windows Hook (您可能在低级全局范围内使用它来捕获键)和WH_CALLWNDPROC
新前台窗口的线程。
收听WM_INPUTLANGCHANGE
该窗口的消息以接收对布局的更改。
(您可能希望在另一个前景更改后取消挂钩/重新挂钩)
看起来键盘布局存储在这里:HKEY_CURRENT_USER\Keyboard Layout\Preload
当我更改键盘语言时,那里的设置顺序发生了变化。
因此,您可能会监视注册表项。这是一种方法: