6

現在のキーボード レイアウトを取得するために GetKeyboardLayoutName ()GetKeyboardLayout( ) を試しましたが、どちらもデフォルトのレイアウトを提供し、レイアウトを変更しても出力には影響しません。

while(1)
{
    Sleep(5);
    for(int i = 8; i < 191; i++)
    {
        if(GetAsyncKeyState(i)&1 ==1)
        {
            TCHAR szKeyboard[KL_NAMELENGTH];
            GetKeyboardLayoutName(szKeyboard);

            if(GetAsyncKeyState(i)&1 ==1)
            {
                TCHAR szKeyboard[KL_NAMELENGTH];
                GetKeyboardLayoutName(szKeyboard);
                cout << szKeyboard << endl ;
            }
        }
    }
}

デフォルトのレイアウトが英語に設定されている場合は常に「00000409」と表示されますが、レイアウトをペルシア語に変更すると「00000429」と予想されます。

ここでの最初の質問は、検索するだけですべての答えを見つけていました。しかし、今、私は何時間も探し回り、何も得られなかった後、夢中になっています...

4

2 に答える 2

9

注意する必要があることの1つは、:: GetKeyboardLayout(..)が渡されたスレッド識別子の言語をパラメーターとして取得することです。

各入力スレッドは、異なる入力ロケール言語を持つことができます。たとえば、IEをフォアグラウンドに置き、Alt + Shiftを押すと、言語がUKに変わります。(タスクバーで確認できます)

ここで、Alt + Tabキーを押して別のウィンドウ(前に表示されます)に移動すると、langが英国に留まる必要がないことがわかります。

したがって、確認する必要があるのは、渡すスレッドIDです。

このコードを見ると、現在アクティブなウィンドウの言語がわかります。

GUITHREADINFO Gti;
::ZeroMemory ( &Gti,sizeof(GUITHREADINFO));
Gti.cbSize = sizeof( GUITHREADINFO );
::GetGUIThreadInfo(0,&Gti);
DWORD dwThread = ::GetWindowThreadProcessId(Gti.hwndActive,0);
HKL lang = ::GetKeyboardLayout(dwThread);

GUITHREADINFOを使用するには、WINVER0x500を定義する必要があります。すべてのインクルードの前にこれをstdafx.hに入れます。

#ifdef WINVER
#undef WINVER
#endif 
#define WINVER 0x500

ソース:GetKeyboardLayoutが正しい言語IDを返さない(WINXP)

于 2012-09-12T07:41:10.457 に答える