【问题标题】:Hide cursor on remote terminal隐藏远程终端上的光标
【发布时间】:2011-02-08 15:14:06
【问题描述】:

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

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

【问题讨论】:

    标签: c sockets terminal text-cursor


    【解决方案1】:

    如果这是使用“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);
    

    希望这会有所帮助。

    【讨论】:

    • 问题似乎是关于隐藏光标,而不是隐藏用户输入。
    【解决方案2】:

    这是ncurses 库可以为您做的事情。

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

    【讨论】:

      【解决方案3】:

      如果您使用的终端支持 ANSI 格式,您应该可以发送以下escape codes

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

      【讨论】:

      • 我知道这已经有几年了,但你从哪里得到这个命令?里面有其他转义码的链接吗?
      • 除非别无选择,否则不要对终端控制代码进行硬编码。使用 ncurses 查找当前 $TERM 值的相应代码,除非由于某种原因不能使用 ncurses。
      • 就像我的代码运行在带有 8KB ROM 的 PIC 微处理器上?
      【解决方案4】:

      为了扩展 mjh2007 的答案,以下 c/c++ 代码将实现将转义码发送到终端,并且比原始十六进制数字更具可读性。

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

      【讨论】:

      • 除非别无选择,否则不要对终端控制代码进行硬编码。使用 ncurses 查找当前 $TERM 值的相应代码,除非由于某种原因不能使用 ncurses。
      • 我同意 ncursrs 是最好的,但如果由于某种原因您无法访问它,这在某些情况下可能是一个“足够好”的解决方案。
      • Powershell 似乎尊重这个序列,如果它前面有一个 SGR 转义序列或一个光标移动序列,但如果它前面有一些其他序列,包括 ?25 的另一个实例,则不是! \e[0m\e[?25h 似乎工作正常。
      猜你喜欢
      • 2022-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 2011-10-06
      • 1970-01-01
      • 2014-07-19
      • 2021-01-27
      相关资源
      最近更新 更多