矢印キーを使用してワイド文字に変換できるかどうかを判断しようとしています。私はその getch() 関数に conio.h を使用しています。同様の関数と比較してどのように機能するかが好きで、矢印キーを取得するには 2 回呼び出す必要があります。
矢印キーを押すと、最初の文字として 0xE0 (-32) が返され、{左 = 'K'、上 = 'H'、右 = 'M'、下 = 'P'} になります。
だから私は2つのキャラクターを1つにマージする方法を見つけようとしています. これは私が思いついた最も近いものです。ただし、ファンクション キーは機能しません。ファンクション キーを押しても、常に同じ値が返されます。{F1-12 = 0, Arrows = 224} 信頼できる Windows 電卓を取り出して、224 が 2 進数の -32 に相当することを確認できました。私はそれをバイトに落とし、10進法を使用し、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 バイトを結合する方法を見つけました。これを投稿した時点では、労働組合が何であるかを知りませんでした。ユニオンにより、2 つの異なるデータ型に同じメモリ空間を使用できます。仕組みはこちら - http://www.cplusplus.com/doc/tutorial/other_data_types/