WriteConsoleW 在最后一列中写入 2 列字符时永远卡死,且禁用了自动换行
QQ Windows 终端版本
1.24.11911.0 (韩语).
QQ Windows 构建编号
10.0.26200.9457 (英语).
其他软件
无回复( N)
- 复制步骤
这个错误报告起源于“ lefthook” 预承诺逻辑的组合, 运行在类似 knip, tsc, pnpm, 更美等平行的事物中 。 这些步骤相当参与, 内部专有代码—— 所以在AI的帮助下,我做了分析,克隆了终端存储器, 并写了一个失败的单元测试 似乎代表了复制的步骤。 请注意,它可能与https://GitHub.com/evilmartians/lefthook/issues/1256有关。
我要求LLM总结复制步骤,
- 说说看
复制步骤
最小、确定性:
- 获得控制台输出手柄并设定模式为 0: 设置 ConsoleMode(出站, 0) —— 这清除了 Enable PROCESED UTPUT, Enable WRAP AT EOL UTPUT 和 Enable Virtual TERMINAL PROSING 在一起。
- 将 Cursor 移动到任意一行的最后一列: SetConsoleCursorPostition(hout, {width - 1, y}).
- 调用文字的写作孔(Write ConsoleW),其文字起始于一个图案组,该组测量出两列——例如:L"\u2714\uFE0F x"(U+2714 HEAVY CHECK MARK + U+FE0F VARIATION SELECTOR-16).
写入 ConsoleW 不再返回 。 主机"Console Driver Message IO Thread"以100%的CPU旋转. 其它每个控制台客户端随后会在其下一个控制台API呼叫上屏蔽,Ctrl+C从不服务,渲染线程无法取取缓冲锁,因此窗口停止再油漆.
仅存一列,集群需要2个,因此每个迭代消耗了0个字符——在将Cursor包去后,故意将Cursor留在原地,所以下一个迭代完全相同.
如何有机生成(这是产生你记忆的路径):
- Cygwin-衍生的 s.exe(Git for Windows)设置输出模式0和原始输入,同时运行一个本地孩子,之后恢复.
- 几枚此类炮弹同时在Go Chook跑道下运行;它们恢复了赛跑,在一时间窗口中以0的速度离开模式.
- 随着Enable PROCESED OUTPUT的关闭,LF被绘制为可打印的格子,而不是移动Cursor——所以Cursor右转并被固定在最后一列.
- 跑者写出其有色状态线,开始为2714 FE0F 0020 001B 005B 0033.——一个检查标记,然后是SGR序列.
- 首个双柱格力克击中被钉住的Cursor和主机楔形.
- 说说看
最后,这是一次单位测试,它可能代表我的问题。 完全公开:这是Claude代码和Opus全写出来的——我对CPP的了解有限. 将它放入眼中,这似乎对错误报告的一部分有用,但可能需要重写才能成为有用的代码吗? 如果这已经是体面的 我很乐意做一个公关 当然。 但主要是增加这个来尝试和帮助:
翻译: diff -- git a/ src/host/ut host/ScreenBuffer Tests.cpp . . . . . . .
内容来源: microsoft/terminal