找出键盘布局何时更改

我正在写一个屏幕键盘,只要键盘布局改变,我想重新布局我的布局。

目前我打电话给:

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

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

我想知道在当前前景窗口的键盘布局被改变时是否有任何方法可以得到通知,所以只要发生改变,我就可以重新绘制布局。

有一种方法 …

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

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

然后用WH_CALLWNDPROC和新的前台窗口的线程使用本地的Windows Hook (你可能使用低级别的全局密钥捕获)
收听该窗口的WM_INPUTLANGCHANGE消息以接收对布局的更改。
(你可能想要在另一个前景改变之后解除/

它看起来像键盘布局存储在这里:HKEY_CURRENT_USER \ Keyboard Layout \ Preload

当我改变键盘语言,那里的设置顺序改变了。

所以你可以监视注册表项。 这里有一个方法:

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