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

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

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

6

Решение

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

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

Теперь, если вы нажмете Alt + Tab в другом окне (которое будет в foregorund), вы увидите, что 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)

8

Другие решения

Следующий код прост и отлично работает. Если вы пишете программу командной строки, 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;
}
1

По вопросам рекламы [email protected]