我正在编写一个屏幕键盘,并希望在更改键盘布局后重新绘制我的布局。
目前我致电:
GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL));
在每次按键时查看布局是否已更改。如果用户通过鼠标更改布局,则不起作用,直到按下键为止。
我想知道是否有任何方法可以获得通知 当前景窗口的键盘布局发生变化时, 所以一旦发生变化,我就可以重新绘制我的布局。
答案 0 :(得分:8)
有办法......
首先,您需要注册您的应用程序以捕获前景窗口更改:
将SetWinEventHook
与EVENT_SYSTEM_FOREGROUND
(以及WINEVENT_OUTOFCONTEXT
,因为它的.NET)一起使用。
如果发生这种情况:使用GetKeyboardLayout
解决方案获取该窗口的当前布局。
然后使用本地Windows Hook (您可能使用低级别全局进行密钥捕获) WH_CALLWNDPROC
以及新前景窗口的线程。
收听该窗口的WM_INPUTLANGCHANGE
条消息,以接收对布局的更改
(您可能希望在另一次前景更改后取消挂钩/重新挂起)
答案 1 :(得分:0)
看起来键盘布局存储在此处: HKEY_CURRENT_USER \ Keyboard Layout \ Preload
当我更改键盘语言时,其中的设置顺序发生了变化。
因此您可以监视注册表项。这是一种方式: