Я пытаюсь определить, можно ли взять клавиши со стрелками и преобразовать их в широкие символы. Я использую conio.h для его функции getch(), мне просто нравится, как она работает по сравнению с аналогичными функциями, и ее нужно вызывать дважды, чтобы получить клавиши со стрелками.
Клавиши со стрелками при нажатии возвращают 0xE0 (-32) в качестве первого символа, а затем {влево = 'K', вверх = 'H', вправо = 'M', вниз = 'P'}
Поэтому я пытался найти способ объединить двух персонажей в один. Это самое близкое, что я придумал. Однако функциональные клавиши не работают с ним, он всегда возвращает одни и те же значения независимо от того, какая функциональная клавиша нажата. {F1-12 = 0, Arrows = 224} Я вытащил верный калькулятор Windows и смог определить, что 224 эквивалентно -32 в двоичном формате. Я просто сократил его до байта и использовал десятичную систему, и получил 100 + 124, и это было = -32.
Так что, может быть, кто-нибудь поможет мне понять, почему преобразование учитывает только первый символ в массиве. Я наверняка сделал что-то не так. Хватит говорить, извините за слишком длинное, если это так, и теперь вот код.
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <wincon.h>
#include <conio.h>
#include <cwchar>
/**int main()
{
int N;
char C;
wchar_t R;
while(true)
{
while(!kbhit()){}
//C = getch();
//if((R == 0) || (R == 224))
std::cout << R << std::endl;
N = R;
std::cout << R << " = " << N << std::endl;
}
}*/
int main()
{
int N = 0;
char C[2];
wchar_t R;
mbstate_t mbst;
while(true)
{
mbrlen(NULL,0,&mbst);
memset(&mbst,0,sizeof(mbst));
for(int i = 0; i < 2; ++i)
{
while(!kbhit()){}
C[i] = getch();
N = C[i];
switch(N)
{
case 0:
break;
case -32:
break;
default:
//input needs to be converted
mbrtowc(&R,C,2,&mbst);
N = R;
std::cout << R << " = " << N << std::endl;
i = 3;
break;
}
}
}
}
Редактировать:
Я нашел способ объединить 2 байта с помощью союза. Я не знал, что такое профсоюз, когда писал это. Объединение позволяет мне использовать одно и то же пространство памяти для двух разных типов данных. Как это работает, описано здесь: http://www.cplusplus.com/doc/tutorial/other_data_types/