使用 fprintf 发送箭头键

Posted

技术标签:

【中文标题】使用 fprintf 发送箭头键【英文标题】:Sending an arrow key with fprintf 【发布时间】:2015-05-17 18:42:51 【问题描述】:

我正在测试管道,但遇到了一个小障碍。

我希望能够通过 popen 打开的文件指针模拟按下右箭头键。文件指针在不同的终端上打开一个显示程序,很像投影仪。我想发送一个信号来推进下一张图片(右箭头键)。

我该如何发送这个信号?我意识到这将特定于我的计算机(BOIS/键盘设置),但无论如何我并不希望它具有便携性。

从我的试验看来,我通过 fprintf 发送的所有内容都被解释为可读字符而不是特殊代码。

幻灯片程序无法更改,因此无法更改。任何方向将不胜感激。

【问题讨论】:

您可以尝试使用fwrite() 而不是fprintf(),但我不确定它是否会起作用。 管道可能无法到达您想去的地方 - 接收程序必须接受这种类型的输入。 @ThomasDickey 还有其他选择吗?在这一点上,我对任何事情都持开放态度。 可能是expect 程序。 This link 声称会带来一些有用的东西。如果是这样,其中一个陷阱是您可能必须经常执行 fflush 才能使其正常工作。 【参考方案1】:

想到两种可能性:

expect 程序可用于控制终端应用程序。它的 wiki 显示 An example wherein Expect controls a pager。 另一方面,问题Sending Arrow Keys to Popen 声称会带来一些有用的东西。特别要注意接受的答案,指向 How to send UP arrow key to popen child,它通过管道发送箭头键的文字转义序列。

从 cmets 看来,这似乎是所要求的。箭头(光标)键转义序列非常标准化,如

所示 Bash Prompt HOWTO: Chapter 6. ANSI Escape Sequences: Colours and Cursor Movement VT100.net: VT100 User Guide: Chapter 3. Programmer Information,例如CUF(光标前进)。

如果这对您有用,那么其中一个陷阱是您可能必须经常发送fflush 才能使其发挥作用。

【讨论】:

我说的太早了,这个解决方案在最终的环境中不起作用,只是在我最初的测试环境中。

以上是关于使用 fprintf 发送箭头键的主要内容,如果未能解决你的问题,请参考以下文章

fprintf函数

c语言函数 fprintf()(向文件写入格式化字符串)

linux下常用函数 ntohs fprintf strupr strlwr

fprintf中使用stderr

fprintf与stderrstdout的使用

C语言 fprintf 函数