我想获得主动语言键盘
获取活动语言我使用此功能:
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);
但是这个函数检索最后一次更改(不是新语言),但我想获得新语言,有什么问题?怎么了?
答案 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]