我正在尝试确定是否可以使用箭头键并将它们转换为宽字符。我将 conio.h 用于它的 getch() 函数,我只是喜欢它与类似函数相比的工作方式,并且必须调用它两次才能检索箭头键。
按下箭头键时返回 0xE0 (-32) 作为第一个字符,然后 {Left = 'K', Up = 'H', Right = 'M', Down = '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/