не удается получить текущую раскладку клавиатуры

Я пробовал 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", когда я изменяю макет на фарси.

мой первый вопрос здесь, я использовал, чтобы найти все мои ответы, просто поиск. Но прямо сейчас я схожу с ума после нескольких часов поисков и ничего не получаю...

2 ответов


одна вещь, которую вам нужно заметить, это :: GetKeyboardLayout (..) получает lang для переданного идентификатора потока как param.

каждый входной поток может иметь различный язык языка ввода. например, если вы поместите IE на передний план и нажмите Alt + Shift, изменения lang в UK. (вы можете увидеть его на панели задач )

теперь, если вы Alt + Tab в другое окно (которое будет в foregorund), вы увидите, что lang не должен оставаться в Великобритании.

Так что вам нужно проверить, что такое идентификатор потока, который вы передаете.

посмотрите на этот код, он даст вам lang для текущего активного окна:

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

для использования GUITHREADINFO необходимо определить WINVER 0x500. положите это в stdafx.h перед всеми включениями.

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

источник: GetKeyboardLayout не возвращает правильный идентификатор языка (WINXP)


следующий код прост и работает нормально. Если вы пишете программу командной строки GetKeyboardLayout API не работает в Windows cmd или powershell, вы можете проверить его в babun(оболочка windows с открытым исходным кодом).

#include <Windows.h>
int getInputMethod() {
  HWND hwnd = GetForegroundWindow();
  if (hwnd) {
    DWORD threadID = GetWindowThreadProcessId(hwnd, NULL);
    HKL currentLayout = GetKeyboardLayout(threadID);
    unsigned int x = (unsigned int)currentLayout & 0x0000FFFF;
    return ((int)x);
  }
  return 0;
}