我正在创建一个库,以便更轻松地进行控制台输入和输出(基本上是一种我可以用于 VIM 之类的引擎)。所以我在 Windows 下使用
_getch()
进行字符输入。
但是,当涉及到所谓的“扩展键”时,我遇到了麻烦 - 就像 Linux 下的
0x1B
(ESC) 一样,Windows 也定义了多字节输入值。对于 Linux,我使用 select
来读取一行中的所有连续字符。但 Windows 版本的 select
尚未完全实现,因此没有选择。
在 Windows 中,这些“扩展键”以
0x00
或 0xE0
开头。虽然 0x00
没有问题,但 0xE0
是 - 因为对于传统代码页,0xE0
通常是它自己的字符(Windows-1252 将其定义为 à
),甚至对于 UTF-8,0xE0
也可以是字符的有效第一个字节(例如每个人最喜欢的 Unicode 字符 ඞ
- 它被编码为 0xE0 0xB6 0x9E
)。使用 UTF-16 _getwch()
也没有帮助,因为 0x00E0
=U+00E0
也是一个有效的 Unicode 值。
我也已经尝试过
_kbhit()
,当我“同时”按下多个键时,它也会返回非零,这与Linux上的select
不同,超时为0。
所以我的问题是:有什么方法可以判断下一个字符是否仍然属于相同的输入?
我基本上希望完成以下代码示例:
#include <conio.h>
int main()
{
bool bExit = false;
while (!bExit)
{
std::string sInput = (char)_getch();
while (NextKeyBelongsToSameInput()) // <-- what function to use?
{
sInput += (char)_getch();
}
// (process sInput)
bExit = sInput == "\x1B"; // exit on ESC
}
return 0;
}
我真的更愿意坚持使用 Win32 函数而不使用第 3 方库。
我的问题好像没有解决办法?除非假设打字速度较慢,以便
_kbhit()
在按键之间返回零。
我仍然愿意接受建议,但似乎我要求太多,而且 Windows 控制台输入在“转义序列”(扩展键)方面没有明确定义,并且某些组合不明确。 🤷u200d♂️