当用户在Windows中更改语言键盘布局时如何通知?

时间:2013-07-28 11:45:59

标签: c++ c winapi

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

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

2 个答案:

答案 0 :(得分:4)

传统的做法是处理WM_INPUTLANGCHANGE message。但是这种方法存在一些问题:

然后,更好的解决方案是实现ITfLanguageProfileNotifySink interface,无论输入语言如何更改,都会在输入语言发生变化时调用OnLanguageChanged method

但是,我发现你的问题都标有C和C ++标签。你可以使用来自C的COM,但这是一个真正的痛苦。如果你使用C ++会更简单。如果我需要在C程序中完成这项工作,我可能只是找到一种方法让WM_INPUTLANGCHANGE为我工作。也许我只是懒惰。

答案 1 :(得分:1)

您可以使用 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