在远程终端隐藏光标

13

我有一个连接到远程终端的开放式套接字。使用“Force telnet client into character mode” 的答案,我能够将该终端置于字符模式。

我的问题是,如何使用这种方法隐藏远程终端中的光标?

4个回答

18

在扩展mjh2007的回答中,以下C/C++代码将实现将转义码发送到终端,并且比原始十六进制数字稍微更易读。

void showCursor(bool show) const {
#define CSI "\e["
  if (show) {
    fputs(CSI "?25h", stdout);
  }
  else {
    fputs(CSI "?25l", stdout);
  }
#undef CSI
}

2
除非没有其他选择,否则不要硬编码终端控制代码。使用ncurses查找当前$TERM值的适当代码,除非由于某些原因无法使用ncurses。 - Chris Page
11
我同意ncurses是最好的选择,但如果由于某些原因你无法使用它,这个解决方案对于某些情况来说可能已经足够了。 - joesdiner
1
如果在SGR转义序列或光标移动序列之前出现,PowerShell似乎会尊重此顺序,但如果在其他一些序列之前出现,包括另一个?25的实例,则不会!\e[0m\e[?25h似乎可以正常工作。 - John Dvorak
3
关于转义码:\e[?25h\e[?25l。为了记忆,可以将 L 视为“Lehidden”(隐藏),而将 H 视为“HonestlyTheCursorWillBeVisible”(实话说光标将可见)。 - Samie Bencherif
2
不冒犯,但是为此使用ncurses就像下载一个Web浏览器来阅读文本文件一样 :) @ChrisPage - Samie Bencherif

13

这是一个由ncurses库可以为您完成的功能。

curs_set()函数可以使光标变得不可见。


6

如果您使用的终端支持ANSI格式,则应该能够发送以下转义代码

隐藏光标:0x9B 0x3F 0x32 0x35 0x6C
显示光标:0x9B 0x3F 0x32 0x35 0x68

我知道这已经过去几年了,但你从哪里得到那个命令的?有其他转义码的链接吗? - Cybrix
3
除非没有其他选择,否则不要硬编码终端控制代码。使用ncurses查找适用于当前$TERM值的适当代码,除非由于某些原因无法使用ncurses。 - Chris Page
11
我的代码正在运行在一个带有8KB ROM的PIC微处理器上? - mjh2007

3
如果使用的是“telnet”应用程序,则您的应用程序应发送“IAC WILL ECHO”以禁用其远程端上的回显。这对于输入密码或者如果您的应用程序正在进行回显非常有用。
#define TEL_IAC "\377"
#define TEL_WILL "\373"
#define TEL_ECHO "\001"

char buf[4];
snprintf(buf, sizeof(buf), "%c%c%c" TEL_IAC, TEL_WILL, TEL_ECHO);
write(sock, buf, sizeof(buf));

或者

write(sock, TEL_IAC TEL_WILL TEL_ECHO, 3);

希望这能帮到您。

3
这个问题似乎是关于隐藏光标而不是隐藏用户输入。 - Chris Page

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接