如何从命令行删除/隐藏 cmd.exe 中的光标(闪烁的下划线字符)?

如何从命令行删除/隐藏 cmd.exe 中的光标(闪烁的下划线字符)?

在您说任何话之前,我知道右键单击 cmd.exe 窗口标题并单击“属性”或“默认值”并更改光标的颜色。这不是我的意思,原因有二:

  1. 它需要手动点击,而不是终端命令或转义序列。
  2. 即使你这样做了(我试过了),即使背景是黑色的,你也将其设置为黑色,它也不会隐藏光标,因为它是“绘制”的,所以它比底线高出一个像素,这意味着它会在恰好位于该位置的任何字符上绘制一条黑线。(而且,很明显,只要背景发生变化,它就会崩溃。)

相同的设置还允许您更改光标的“样式”,但这些样式中没有一个被称为“无”或“空”。它们只是闪烁下划线的细微变化。我知道您可以在 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 中运行。

相关内容