使用LoadKeyboardLayout()设置设备标识符

时间:2013-05-27 11:26:01

标签: windows winapi

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

通过在控制面板(区域 - >键盘和语言)中手动设置此组合,然后运行一个调用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”的设备标识符?

1 个答案:

答案 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);

参考文献:

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

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