我正在编写一个跨平台交互式终端程序,用于接收光标查询响应和鼠标事件。 (光标查询实际上是为了检测窗口大小的变化,因为窗口操作通常被禁用。)它在 Linux 中工作正常,但在 Windows 中我得到交错的事件序列,例如:
\x1b\x1b[46;128R[<32;54;17M
这发生在
PowerShell
和 cmd.exe
中。交错序列似乎总是以 \x1b\x1b
开头,但我觉得这不太令人放心。我可以通过关闭鼠标事件、等待延迟、查询光标、等待另一个延迟以及重新打开鼠标事件来减少交错的发生。但这会降低程序的响应速度,并且仍然无法消除所有发生的情况。
我该如何处理这些交错序列?我可以让 Windows 不交错吗?或者我应该有一个标准的方法来解析交错序列? (这个记录在哪里?)
我怀疑,这是“\x1b[6n”的问题。
看看linux/windows的区别
按照顺序进行测试
\x1b[1;1H\x1b[6n\x1b[7;7H\x1b[6n
在 Linux 上,响应是:
\x1b[1;1R\x1b[7;7R
在 Windows 上,响应是:
\x1b[7;7R\x1b[1;1R
Linux 只是将查询的答案附加到输入缓冲区的末尾, 但 Windows 将答案(如
\x1b[6n
和 \x1b[0c
)放在输入缓冲区的前面。
这似乎是错误的,或者至少不是很明智。
而且似乎在某些情况下,如果要插入另一个序列(例如您的鼠标位置),它可能会失败。
当要插入鼠标位置时,报告光标位置答案似乎可能会中断消息,但它不是简单地在前面插入,而是从位置 1 开始。
通过检查两个 ESC 应该可以解决问题,当第二个转义开始有效的
ESC[x;yR
序列时,然后假设您已经获得了下一个序列的 ESC。