问题是:我必须将用户的语言设置为简体中文,键盘设置为“中文(简体) - 微软拼音新体验输入”。
通过在控制面板(区域 - >键盘和语言)中手动设置此组合,然后运行一个调用GetKeyboardLayoutName()的小测试程序,我发现KLID是00000804(据说是)。如果我从控制面板中的键盘和语言中删除中文并运行:
HKL hKeyboardLayout = ::LoadKeyboardLayout(_T("00000804"), KLF_ACTIVATE | KLF_SETFORPROCESS);
然后语言确实改为中文,但键盘设置错误。输入内容时,小“IME框”丢失了。
LoadKeyboardLayout()的MSDN page说明了pwszKLID参数:
要加载的输入区域设置标识符的名称。该名称是由语言标识符(低位字)的十六进制值和设备标识符(高位字)组成的字符串。例如,美国英语的语言标识符为0x0409,因此主要的美国英语布局名为“00000409”。美国英语布局的变体(例如Dvorak布局)被命名为“00010409”,“00020409”等。
因此,看起来好像GeyKeyboardLayout()仅报告语言标识符(中文为0x0804),但缺少“设备标识符”。如何找到“Microsoft Pinyin New Experience Input st”的设备标识符?
答案 0 :(得分:1)
找到解决方案。显然在Vista(及以后)中,必须使用InstallLayoutOrTip()和正确的GUID(不是KLID)来安装正确的语言 - 键盘组合。然后你可以调用LoadKeyboardLayout()来加载它。
typedef HRESULT (WINAPI *PTF_INSTALLLAYOUTORTIP)(LPCWSTR psz, DWORD dwFlasg);
// Install.
HMODULE hInputDLL = LoadLibrary(_T("input.dll"));
BOOL bRet = FALSE;
if(hInputDLL == NULL)
{
// Error
}
else
{
PTF_INSTALLLAYOUTORTIP pfnInputLayoutOrTip;
pfnInputLayoutOrTip = (PTF_INSTALLLAYOUTORTIP)GetProcAddress(hInputDLL, "InstallLayoutOrTip");
if(pfnInputLayoutOrTip)
{
bRet = (*pfnInputLayoutOrTip)(_T("0804:{81D4E9C9-1D3B-41BC-9E6C-4B40BF79E35E}{F3BA9077-6C7E-11D4-97FA-0080C882687E}"), 0);
if(! bRet)
{
// Error
}
}
else
{
// Error
}
FreeLibrary(hInputDLL);
}
// Load.
HKL hKeyboardLayout = ::LoadKeyboardLayout(_T("00000804"), KLF_ACTIVATE | KLF_SETFORPROCESS);
参考文献: