如何将角色发布到控制台程序的 STDIN?

How do I post a character to a console program's STDIN?

提问人:couldabin 提问时间:11/3/2023 最后编辑:Remy Lebeaucouldabin 更新时间:11/3/2023 访问量:45

问:

我正在用 C 编写一个 Win32 程序,该程序启动一个控制台应用程序,可以通过按下键盘来停止。按下键盘会使控制台应用程序停止;我只是想用我正在编写的程序来模仿这一点。QQ

我没有运气,我认为是标准方法:

  • 初始化结构SECURITY_ATTRIBUTESbInheritHandle=TRUE
  • 使用该结构调用以初始化读取和写入句柄CreatePipe()
  • 创建结构STARTUPINFOdwFlags=STARTF_USESTDHANDLES
  • 分配给初始化的读取句柄hStdInputCreatePipe()

我的程序使用初始化的结构启动控制台应用程序,并在调用 .控制台程序没有响应。CreateProcess()STARTUPINFOqhStdInputWriteFile()

我应该发送扫描码而不是文本字符吗?

WinAPI 控制台-应用程序 stdin

评论

0赞 Remy Lebeau 11/3/2023
你写的是小写还是大写?请注意,写入进程与模拟键盘按键不是一回事。也许该过程是直接监控键盘按下而不是监控?我们对您启动的计划一无所知。qQstdinstdin
0赞 Jeaninez - MSFT 11/3/2023
是否要实现一个程序(A)启动另一个程序(B),程序A可以用键盘控制程序B的暂停?您能否提供一个示例来帮助我们更好地了解您的需求?Q
0赞 couldabin 11/4/2023
感谢您提供这些有用的见解。我将使用 WriteConsoleInput,并发布“q\r”。恐怕我不知道生成的程序(ffplay.exe,这是开源 ffmpeg 包附带的工具)如何读取输入。在我玩了更多之后,我会更新它。
0赞 Hans Passant 11/4/2023
FFPlay 不是一个控制台模式的程序,所以修补 stdin 不会让你走到任何地方。使用 SendInput() 模拟键盘输入
0赞 couldabin 11/4/2023
谢谢你的提示。我只是尝试了 SendInput(),但仍然没有运气让 FFPlay 响应它。该代码确实适用于记事本 - 如果我打开记事本并调用 SendInput(),则“q”会出现在那里。我真的认为这可能会奏效。

答:

0赞 Seva Alekseyev 11/3/2023 #1

如果控制台程序对 的按键而不是带有“q”的输入字符串做出反应,则它绝对不会通过从 stdin 读取来处理输入。Stdin 仅在按下时向主机应用程序发送输入。该程序很可能使用或类似的东西。qEnterReadConsoleInput

您可以测试一下 - 制作一个包含 q 的文本文件,使用 .很有可能,它不会退出。<q.txt

我没有准备好一个例子,但似乎是要走的路。WriteConsoleInput

评论

0赞 Remy Lebeau 11/3/2023
"Stdin 仅在按下 Enter 时向主机应用程序发送输入“ - 更准确地说,控制台/终端处理该缓冲,而不是 stdin 本身。
0赞 Seva Alekseyev 11/3/2023
要点是,如果你从 stdin 读取,它会阻塞,直到按下 Enter 键。
2赞 Remy Lebeau 11/3/2023
同样,该行为由控制台/终端控制,而不是由 stdin 本身控制。当然,可以将数据通过管道传递到生成进程的 stdin 中,而无需发送 Enter。它还取决于生成的程序如何从 stdin 读取数据,因为它在处理数据之前可能需要 Enter。
0赞 Seva Alekseyev 11/4/2023
使用 Depends(或 ILSpy,如果托管)浏览 OP 的控制台程序可能会很有启发性。