获取当前活动的语言键盘

时间:2018-01-20 10:56:53

标签: c++ winapi

我想获得主动语言键盘

获取活动语言我使用此功能:

WCHAR name[256];

GUITHREADINFO Gti;
::ZeroMemory(&Gti, sizeof(GUITHREADINFO));
Gti.cbSize = sizeof(GUITHREADINFO);
::GetGUIThreadInfo(0, &Gti);
DWORD dwThread = ::GetWindowThreadProcessId(Gti.hwndActive, 0);
HKL lang = ::GetKeyboardLayout(dwThread);

LANGID language = (LANGID)(((UINT)lang) & 0x0000FFFF); // bottom 16 bit of HKL is LANGID
LCID locale = MAKELCID(language, SORT_DEFAULT);

GetLocaleInfo(locale, LOCALE_SLANGUAGE, name, 256);

return CString(name);

但是这个函数检索最后一次更改(不是新语言),但我想获得新语言,有什么问题?怎么了?

1 个答案:

答案 0 :(得分:1)

从doucmentation(GetKeyboardLayout function)中,当0用作默认参数时,它从当前线程获取键盘布局:

HKL lang = ::GetKeyboardLayout(0);

要创建语言ID,请使用以下宏:

#define MAKELANGID(p, s)       ((((WORD  )(s)) << 10) | (WORD  )(p))

还定义了以下辅助宏:

#define PRIMARYLANGID(lgid)    ((WORD  )(lgid) & 0x3ff)
#define SUBLANGID(lgid)        ((WORD  )(lgid) >> 10) 

所以我把代码修改为:

LANGID language = PRIMARYLANGID(lang);

它适用于我。

要收听键盘更改,应处理WM_INPUTLANGCHANGE消息。

实际上你必须在指定的线程中有一个消息循环,否则在重新启动应用程序之前不会检测到语言的更改,控制台应用程序就是一个很好的例子。[2]