如何在用户更改Windows中的语言键盘布局时得到通知

How to be informed when user changes the language keyboard layout in Windows?

本文关键字:布局 键盘 语言 通知 用户 Windows      更新时间:2023-10-16

当用户更改Windows的语言键盘布局时,我想向用户显示一条消息,例如从EN更改为FR。但我不知道当用户使用任务栏或ALT+SHIFT更改它时,如何通知我。我应该使用哪个win32api函数?我需要这样的伪代码:

void inputLanguageChanged(char *ln)
{
  message("You selected " + ln + " language");
}

执行此操作的传统方法是处理WM_INPUTLANGCHANGE消息。但这种方法有几个问题:

  • 它只发送到活动(聚焦)窗口,并且
  • 它并不能捕捉到所有可能的情况,而且在现代版本的Windows上可能不可靠

因此,更好的解决方案是实现ITfLanguageProfileNotifySink接口,无论输入语言的更改方式如何,只要输入语言发生更改,就会调用其OnLanguageChanged方法。

然而,我看到您的问题同时带有C和C++标记。您可以使用来自C的COM,但这真是令人头疼。如果你使用的是C++,那就简单多了。如果我需要在C程序中完成这项工作,我可能会找到一种方法让WM_INPUTLANGCHANGE为我工作。也许我只是懒惰。

您可以使用WM_INPUTLANGCHANGE消息:

case WM_INPUTLANGCHANGE:
{
    HKL hkl = (HKL)lParam;
    WCHAR localeName[LOCALE_NAME_MAX_LENGTH];
    LCIDToLocaleName(MAKELCID(LOWORD(hkl), SORT_DEFAULT), localeName, LOCALE_NAME_MAX_LENGTH, 0);
    WCHAR lang[9];
    GetLocaleInfoEx(localeName, LOCALE_SISO639LANGNAME2, lang, 9);
}

https://learn.microsoft.com/windows/win32/intl/locale-nameshttps://learn.microsoft.com/windows/win32/intl/nls--name-based-apis-sample