找出键盘布局何时更改

时间:2011-11-27 22:08:01

标签: c# .net windows keyboard keyboard-layout

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

目前我致电:

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

在每次按键时查看布局是否已更改。如果用户通过鼠标更改布局,则不起作用,直到按下键为止。

我想知道是否有任何方法可以获得通知 当前景窗口的键盘布局发生变化时, 所以一旦发生变化,我就可以重新绘制我的布局。

2 个答案:

答案 0 :(得分:8)

有办法......

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

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

然后使用本地Windows Hook (您可能使用低级别全局进行密钥捕获) WH_CALLWNDPROC以及新前景窗口的线程。
收听该窗口的WM_INPUTLANGCHANGE条消息,以接收对布局的更改 (您可能希望在另一次前景更改后取消挂钩/重新挂起)

答案 1 :(得分:0)

看起来键盘布局存储在此处:    HKEY_CURRENT_USER \ Keyboard Layout \ Preload

当我更改键盘语言时,其中的设置顺序发生了变化。

因此您可以监视注册表项。这是一种方式:

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