找出键盘布局何时更改

Nej*_*chy 11 .net c# windows keyboard keyboard-layout

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

目前我打电话给:

GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL));
Run Code Online (Sandbox Code Playgroud)

在每个按键上查看布局是否已更改.如果用户通过鼠标更改布局,则按钮不起作用.

我想知道在当前前景窗口的键盘布局发生变化时是否有任何方法可以获得通知,因此我可以在更改发生后立即重新绘制布局.

ord*_*dag 9

有一种方法 ...

首先,你需要注册您的应用程序捕获前台窗口的变化:
使用SetWinEventHookEVENT_SYSTEM_FOREGROUND (和WINEVENT_OUTOFCONTEXT它的.Net)为.

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

然后使用本地的Windows钩子 (你可能使用它的低级别的全球范围内为重点捕获)WH_CALLWNDPROC和新的前台窗口的线程.
收听WM_INPUTLANGCHANGE该窗口的消息以接收对布局的更改.
(您可能希望在另一次前景更改后取消挂钩/重新挂起)