Переключение раскладки клавиатуры на лету в C ++ с помощью функции GetKeyName () в Windows

Я пытаюсь получить ключ-значение для определенного скан-кода на разных языках
следующим образом
Макет: английский США (клавиатура США)
16 — Q
17 — W
18 — E
19 — р
20 — Т
21 — Y
Макет: французский (клавиатура Франции)
16 — А
17 — Z
18 — E
19 — р
20 — Т
21 — Y
для этого я использую следующий код:

#include "pch.h"#include "iostream"#include <windows.h>

using namespace std;
int main()
{
int scancode[6] = { 16,17,18,19,20,21};
int bufferLength = 10;
char buffer[10] ;
while (1)
{
int i = 0;
for (i = 0; i < 6 ; i++)
{
unsigned int extended = scancode[i] & 0xffff00;
unsigned int lParam = 0;

if (extended)
{

if (extended == 0xE11D00)
{
lParam = 0x45 << 16;
}
else
{
lParam = (0x100 | (scancode[i] & 0xff)) << 16;
}

}
else {

lParam = scancode[i] << 16;

if (scancode[i] == 0x45)
{
lParam |= (0x1 << 24);
}
}
GetKeyNameTextA(lParam, buffer, bufferLength);
printf("%s \n", buffer);

}

}
return 0;
}

Этот код дает мне локализованные значения ключей, но если я изменю макет во время выполнения, значения ключей не изменятся. Они остаются такими же, как и раньше, чтобы получить измененные значения, мне нужно запустить его снова. Кто-нибудь может предложить мне исправить это ??
Также предложите, если есть альтернативный способ добиться этого ..

0

Решение

использование LoadKeyboardLayout и отправить WM_INPUTLANGCHANGEREQUEST изменить раскладку клавиатуры следующим образом:

#include <iostream>
#include <string>
#include <windows.h>

int main()
{
HKL hkl = LoadKeyboardLayout(L"0000080c", KLF_ACTIVATE);
PostMessage(GetConsoleWindow(), WM_INPUTLANGCHANGEREQUEST, 0, (LPARAM)hkl);
std::string str;
while(std::cin >> str)
if(str == "0")
break;
return 0;
}
0

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

Других решений пока нет …

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