【发布时间】:2011-02-08 15:14:06
【问题描述】:
我有一个连接到远程终端的开放式套接字。使用“Force telnet client into character mode”的答案,我能够将该终端置于字符模式。
我的问题是,如何使用这种方法在远程终端隐藏光标?
【问题讨论】:
标签: c sockets terminal text-cursor
我有一个连接到远程终端的开放式套接字。使用“Force telnet client into character mode”的答案,我能够将该终端置于字符模式。
我的问题是,如何使用这种方法在远程终端隐藏光标?
【问题讨论】:
标签: c sockets terminal text-cursor
如果这是使用“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);
希望这会有所帮助。
【讨论】:
这是ncurses 库可以为您做的事情。
curs_set() 函数可以使光标不可见。
【讨论】:
如果您使用的终端支持 ANSI 格式,您应该可以发送以下escape codes:
隐藏光标:0x9B 0x3F 0x32 0x35 0x6C 显示光标:0x9B 0x3F 0x32 0x35 0x68【讨论】:
$TERM 值的相应代码,除非由于某种原因不能使用 ncurses。
为了扩展 mjh2007 的答案,以下 c/c++ 代码将实现将转义码发送到终端,并且比原始十六进制数字更具可读性。
void showCursor(bool show) const {
#define CSI "\e["
if (show) {
fputs(CSI "?25h", stdout);
}
else {
fputs(CSI "?25l", stdout);
}
#undef CSI
}
【讨论】:
$TERM 值的相应代码,除非由于某种原因不能使用 ncurses。
?25 的另一个实例,则不是! \e[0m\e[?25h 似乎工作正常。