有没有安全的方法来检测Windows控制台上的扩展键?

问题描述 投票:0回答:1

我正在创建一个库,以便更轻松地进行控制台输入和输出(基本上是一种我可以用于 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 方库。

c++ winapi input console dos
1个回答
0
投票

我的问题好像没有解决办法?除非假设打字速度较慢,以便

_kbhit()
在按键之间返回零。

我仍然愿意接受建议,但似乎我要求太多,而且 Windows 控制台输入在“转义序列”(扩展键)方面没有明确定义,并且某些组合不明确。 🤷u200d♂️

© www.soinside.com 2019 - 2024. All rights reserved.