【问题标题】:How to be informed when user changes the language keyboard layout in Windows?当用户更改 Windows 中的语言键盘布局时如何通知?
【发布时间】:2021-04-02 18:26:26
【问题描述】:

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

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

【问题讨论】:

标签: c++ c winapi


【解决方案1】:

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

因此,更好的解决方案是实现ITfLanguageProfileNotifySink interface,只要输入语言发生变化,就会调用其OnLanguageChanged method,而不管其更改方式如何。

但是,我看到您的问题同时带有 C 和 C++ 标记。您可以使用 C 中的 COM,但这确实令人头疼。如果您使用 C++,则简单得多。如果我需要在 C 程序中完成这项工作,我可能只是想办法让WM_INPUTLANGCHANGE 为我工作。也许我只是懒惰。

【讨论】:

  • 非常感谢 :) 。我对 WM_INPUTLANGCHANGE 的问题是我不知道如何获取当前的键盘布局字符串。我可以得到它的 id 但如何将它转换为用户可读的字符串。
  • @saeed 只需致电GetKeyboardLayoutName。这将返回调用线程的键盘布局名称。
  • 对不起,我以前用过它,但它返回一个类似 00000429 的字符串。我的代码是:char * lang = new char[KL_NAMELENGTH ];GetKeyboardLayoutNameA(lang);
  • @saeed 嗯,是的,那是因为它返回传递给 LoadKeyboardLayout 的任何内容。唯一的另一种方法是从注册表中读取信息。这确实应该作为一个新问题提出,但this blog article 可能会有所帮助。
  • @saeed 不客气。另外,你为什么要调用 ANSI 函数? Windows 应用程序现在应该都是 Unicode。使用wchar_tGetKeyboardLayoutNameW
【解决方案2】:

你可以使用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://docs.microsoft.com/windows/win32/intl/locale-names https://docs.microsoft.com/windows/win32/intl/nls--name-based-apis-sample

【讨论】:

    猜你喜欢
    • 2012-03-29
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    相关资源
    最近更新 更多