在您说任何话之前,我知道右键单击 cmd.exe 窗口标题并单击“属性”或“默认值”并更改光标的颜色。这不是我的意思,原因有二:
- 它需要手动点击,而不是终端命令或转义序列。
- 即使你这样做了(我试过了),即使背景是黑色的,你也将其设置为黑色,它也不会隐藏光标,因为它是“绘制”的,所以它比底线高出一个像素,这意味着它会在恰好位于该位置的任何字符上绘制一条黑线。(而且,很明显,只要背景发生变化,它就会崩溃。)
相同的设置还允许您更改光标的“样式”,但这些样式中没有一个被称为“无”或“空”。它们只是闪烁下划线的细微变化。我知道您可以在 Windows 中全局设置闪烁率,但这也无关紧要,因为它需要手动干预,而且无论如何也不会隐藏光标。我不想“一般地”隐藏应用程序的光标——只是为我自己的终端脚本“按需”隐藏光标。
我正在寻找一种方法来自动执行此操作,并且仅适用于运行当前脚本的终端/“会话”。 (这是一个 PHP CLI。)
我尝试过许多旧的 ANSI 转义序列和诸如此类的东西;它们似乎都被忽略了。目前我最好的猜测是,这根本不可能。
请注意,防止光标闪烁虽然不会那么烦人,但也不能解决这个问题,因为它会永久覆盖当前行第一个“列”中的字符。
看起来,如果不下载那些可怕、粗糙、古老的 MS-DOS 可执行文件,这真的是不可能的,我根本不想在我的计算机上信任这些文件。我也不想使用一些第三方 cmd.exe“替换程序”。这些解决方案对我来说不是解决方案,因为这应该在“原始”系统上运行,无论是 Windows、Linux 还是 Mac boxen。
我运行的是最新版本的 Windows 10,但还没有任何“Windows 终端”,因此我无法判断它是否允许这样做。无论如何,Windows 上的 PHP CLI 似乎与 cmd.exe 紧密相关,因此 PowerShell 和 Windows 终端相关的解决方案目前对我来说都不相关。也许在未来,当 Windows 上的 PHP 开始使用其中之一或允许您轻松地告诉它使用它们时。
摆脱 cmd.exe 中令人讨厌的闪烁光标真是太好了。
答案1
如果您使用的是 Windows 10,ANSI 转义序列应该可以正常工作。
您可以使用以下命令获取转义字符:
for /F "delims=#" %a in ('prompt #$E# ^& for %a in ^(1^) do rem') do set esc=%a
因此:
echo.%esc%[?25l
将隐藏光标。
该字母l
是字母L
,但不大写。
答案2
这是一个小型 C 程序,用于隐藏 Windows 控制台中的光标:
#include <Windows.h>
int main(void)
{
HANDLE hStdOut = NULL;
CONSOLE_CURSOR_INFO curInfo;
hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleCursorInfo(hStdOut, &curInfo);
curInfo.bVisible = FALSE;
SetConsoleCursorInfo(hStdOut, &curInfo);
return 0;
}
该代码可以转换为具有任何 Win32 包装器的其他编程语言,例如 python、rust 等。
它的作用是:
这个简单的程序检索当前控制台中的标准输出句柄。然后检索有关指定控制台屏幕缓冲区的光标大小和可见性的信息,并通过将bVisible
布尔值设置为 false 来禁用光标可见性。然后为指定的控制台屏幕缓冲区设置该配置。
使用的 Win32 API:
答案3
一个叫 Aacini 的人发布了一个隐藏光标的程序,可从他的文章中获取:
通过辅助 .exe 程序实现高级批处理功能。
本文包含他的所有程序在文件中 辅助.exe程序.zip。
您想要的程序CursorSize.exe
描述如下:
获取或设置光标大小。
CursorSize [size|/L]
光标大小是光标填充的字符单元格的百分比(1..100)。用于
0
隐藏光标;用于/L
恢复上次隐藏的光标。最后,在 ERRORLEVEL 中返回先前的游标大小。
我测试了该程序,它仍然可以在 Windows 10 上的 CMD 中运行。