Почему я не могу прочитать все Ctrl + «буквы»

Я создал программу, которая позволяет мне читать все автономные функциональные клавиши (по крайней мере, я думал проверить) на моей клавиатуре. Я разработал его так, чтобы я мог ссылаться на любой ввод одной клавиши как на одно значение. Это обрабатывает Вернуть, F1F12, удалять, возврат на одну позицию, стрелки и т. д.

Я просто подумал, чтобы проверить модификации ввода. Я уже убедился, что смена работает, но теперь я решил проверить Ctrl а также Alt.

Вопрос 1
Почему Alt не изменить ни один из кодов клавиш ввода?

вопрос 2
Почему я не могу захватить определенные Ctrl + комбинации?
Например. Ctrl + s; Ctrl + 19;

Ctrl + 2 работает, но я думаю, что это может быть связано с тем, что моя клавиатура установлена ​​в Великобритании.

Это код, который я использую.

Пожалуйста, обратите внимание, я не обязательно спрашиваю, как захватить эти комбинации клавиш (если это не простая модификация или два). Я только хочу знать, почему я не могу.

#include <iostream>
#include <conio.h>
#include <cwchar>

union wide_char
{
short Result;
char C[2];
};

int main()
{
wchar_t R;
int N;
wide_char user_input;
//Loops forever, this is only a proof of concept program proving this is possible to incorporate into a larger program
while(true)
{
user_input.C[0] = 0;
user_input.C[1] = 0;
//Loop twice, or until code causes the loop to exit
//Two times are neccessary for function keys unfortunately
for(int i = 0; i < 2; ++i)
{
//While there isn't a key pressed, loop doing nothing
while(!kbhit()){}
//Grab the next key from the buffer
//Since the loop is done, there must be at least one
user_input.C[i] = getch();
switch(user_input.C[i])
{
case 0:
case -32:
//The key pressed is a Function key because it matches one of these two cases
//This means getch() must be called twice
//Break switch, run the for loop again ++i
break;
default:
//The character obtained from getch() is from a regular key
//Or this is the second char from getch() because the for loop is on run #2
//Either way we need a wide char (16 bits / 2 Bytes)
if(user_input.C[1] != 0)
//Function keys {Arrows, F1-12, Esc}
//We now combine the bits of both chars obtained
//They must be combined Second+First else the F1-12 will be duplicate
//This is because on F1-12 getch() returns 0 thus won't affect the combination
R = user_input.Result;
else
//Regular key press
R = user_input.C[0];
//Display our unique results from each key press
N = R;
std::cout << R << " R = N " << N << std::endl;

if( R == 'a' )
std::cout << "a = " << N << std::endl;
//Manually break for loop
i = 3;
break;
}
}
//We need to reset the array in this situation
//Else regular key presses will be affected by the last function key press
}
}

0

Решение

Это очень специфично для вашей среды. Вы используете conio который специфичен для DOS / Windows.

Большинство из Ctrl + Значения буквенных ключей привязаны к символам 1 — 26, а некоторые другие привязаны к другим значениям до 31 для сопоставления с управляющими символами ASCII. Но некоторые, как Ctrl + S имеют особое значение (Ctrl + S это XOFF в ASCII), и поэтому может быть «съеден» вашей средой.

По сути, проблема, с которой вы сталкиваетесь, заключается в том, что getch приближается к интерфейсу последовательного терминала старой школы. Они отображают события клавиатуры только на уровне «наименьшего общего знаменателя», в отличие от более низкого уровня, который позволит вам различать клавиши-модификаторы и т. Д. И даст вам лучший способ работы со специальными клавишами, такими как функциональные клавиши.

(Как вы заметили, функциональные клавиши имеют специальные многобайтовые последовательности. Опять же, это связано с эмуляцией последовательных терминалов старой школы, где клавиатура может находиться на другом конце удаленного канала.)

Чтобы получить более низкий уровень (и, следовательно, более прямой и гибкий интерфейс), вам необходимо использовать более специфичную для платформы библиотеку или более богатую библиотеку, такую ​​как SDL. Любой из них даст вам более низкое представление о входах с клавиатуры.

1

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

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

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