1

问题是这样的:我必须将用户的语言设置为简体中文,并将键盘设置为“中文(简体)-微软拼音新体验输入法”。

通过在控制面板(区域-> 键盘和语言)中手动设置此组合,然后运行一个调用 GetKeyboardLayoutName() 的小型测试程序,我发现 KLID 是 00000804(假设)。如果我从控制面板中的键盘和语言中删除中文并运行:

HKL hKeyboardLayout = ::LoadKeyboardLayout(_T("00000804"), KLF_ACTIVATE | KLF_SETFORPROCESS);

然后语言确实改成了中文,但是键盘设置错了。键入内容时缺少小“IME 框”。

LoadKeyboardLayout()的MSDN 页面说明了 pwszKLID 参数:

要加载的输入语言环境标识符的名称。该名称是由语言标识符(低位字)和设备标识符(高位字)的十六进制值组成的字符串。例如,美国英语的语言标识符为 0x0409,因此主要的美国英语布局命名为“00000409”。美国英语布局的变体(例如 Dvorak 布局)被命名为“00010409”、“00020409”等。

所以看起来好像 GeyKeyboardLayout() 只报告语言标识符(中文为 0x0804),但缺少“设备标识符”。如何找到“微软拼音新体验输入法”的设备标识符?

4

1 回答 1

1

找到了解决方案。显然在 Vista(及更高版本)中,您必须使用具有正确 GUID(而不是 KLID)的 InstallLayoutOrTip() 来安装正确的语言键盘组合。然后你可以调用 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);

参考:

http://msdn.microsoft.com/library/bb847909.aspx

http://www.siao2.com/2007/12/01/6631463.aspx

于 2013-05-28T12:43:57.490 回答