C# 了解键盘布局何时更改

C# 了解键盘布局何时更改,c#,.net,windows,keyboard,keyboard-layout,C#,.net,Windows,Keyboard,Keyboard Layout,我正在编写一个屏幕键盘,并希望在键盘布局更改后立即重新绘制布局 目前我呼吁: GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL)); 每按一次键,查看布局是否已更改。如果用户用鼠标更改布局,直到按下该键,它才起作用 我想知道是否有办法得到通知 当前前景窗口的键盘布局更改时, 因此,一旦发生更改,我就可以重新绘制布局。键盘布局似乎存储在此处: HKEY_当前用户\键盘布局\预加载 当我改变键盘语言时,那里

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

目前我呼吁:

GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL));
每按一次键,查看布局是否已更改。如果用户用鼠标更改布局,直到按下该键,它才起作用

我想知道是否有办法得到通知 当前前景窗口的键盘布局更改时,
因此,一旦发生更改,我就可以重新绘制布局。

键盘布局似乎存储在此处: HKEY_当前用户\键盘布局\预加载

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

因此,您可以监视注册表项。这里有一个方法:

有一种方法…

首先,您需要注册应用程序以捕获前台窗口更改:
EVENT\u SYSTEM\u front
(以及
WINEVENT\u OUTOFCONTEXT
作为.NET)一起使用

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

然后使用本地(您可能在全局低级别使用它来捕获关键帧)和新前景窗口的线程。
收听该窗口的消息,以接收对布局的更改。

(在另一次前台更改后,您可能需要解除锁定/重新锁定)

只有在更改默认键盘布局或添加新键盘布局时,HKEY_CURRENT_USER\Keyboard Layout\Preload中的值顺序才会更改