1

問題は次のとおりです。ユーザーの言語を簡体字中国語に設定し、キーボードを「中国語 (簡体字) - Microsoft Pinyin New Experience Input st」に設定する必要があります。

コントロール パネル (地域 -> キーボードと言語) でこのコンボを手動で設定し、GetKeyboardLayoutName() を呼び出す小さなテスト プログラムを実行すると、KLID が 00000804 (おそらく) であることがわかりました。コントロール パネルの [キーボードと言語] から中国語を削除して、これを実行すると、次のようになります。

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

すると言語は確かに中国語に変更されますが、キーボードの設定が間違っています。何かを入力するときに、小さな「IME ボックス」が表示されません。

LoadKeyboardLayout()のMSDN ページには、 pwszKLID パラメータについて次のように記載されています。

ロードする入力ロケール識別子の名前。この名前は、言語識別子 (下位ワード) とデバイス識別子 (上位ワード) の 16 進値で構成される文字列です。たとえば、米国英語の言語識別子は 0x0409 であるため、主要な米国英語レイアウトは「00000409」という名前になります。米国英語レイアウト (Dvorak レイアウトなど) のバリアントには、「00010409」、「00020409」などの名前が付けられます。

そのため、GeyKeyboardLayout() は言語識別子 (中国語の場合は 0x0804) のみを報告しているように見えますが、「デバイス識別子」は欠落しています。"Microsoft Pinyin New Experience Input st" のデバイス識別子を確認するにはどうすればよいですか?

4

1 に答える 1

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

于 2013-05-28T12:43:57.490 に答える