【问题标题】:Send F4 to an input pipe CMD process in Delphi将 F4 发送到 Delphi 中的输入管道 CMD 进程
【发布时间】:2017-05-25 00:41:12
【问题描述】:

如何让 Delphi 将 F4 传递到输入管道到 CMD 进程?我一直在使用与这里的答案非常相似的代码:Pipes in Delphi for Command Prompt

为简单起见,我在表单上只有 4 个对象: 1. CommandText(显示 CMD 窗口表示的 TMemo)。 2. CommandRun(输入要运行的 CMD 行的 TEdit)。 3. SendBtn(用于将 CommandRun.Text 发送到 CMD 的 TButton)。 3. ExitBtn(一个用于退出程序的TButton)。

这是我的 Write Pipe 和 Send 过程:

写管道

procedure WritePipeOut(OutputPipe: THandle; InString: string);
// writes Instring to the pipe handle described by OutputPipe
var
   byteswritten: DWord;
   AnsiBuf: AnsiString;
begin
// most console programs require CR/LF after their input.
   if InString = 'f4' then AnsiBuf :=  #113#13#10
   else AnsiBuf := AnsiString(InString) + #13#10;
   WriteFile(InputPipeWrite, AnsiBuf[1], Length(AnsiBuf), byteswritten, nil);
end;

发送

procedure TForm1.SendBtnClick(Sender: TObject);
begin
   WritePipeOut(OutputPipeWrite, CommandRun.Text);
   CommandRun.Text := '';
   CommandRun.SetFocus;
end;

像 DIR 这样的命令正在正确传递,结果成功地“回显”到 CommandText。 我的问题是我正在通过管道启动一个程序。在正常的 CMD 窗口中,程序只能通过按 F4 键来停止。 我需要通过管道复制这个 F4 按下,只是无法弄清楚如何实现这一点。我将非常感谢任何指导。

【问题讨论】:

    标签: delphi cmd pipe


    【解决方案1】:

    F4 不是通过标准输入传输的东西。这个控制台应用程序几乎可以肯定是直接读取键盘输入。

    您将需要寻找另一种方法来解决此问题。我建议如下:

    1. 确保cmd 窗口具有输入焦点并伪造F4 键的输入。我想将焦点移到cmd 窗口会是您不愿意做的事情。
    2. 使用其他方法停止此过程。该进程是否支持除控制台窗口的 F4 按键以外的任何内容,因为我们对所讨论的进程一无所知,因此无法从此处确定。
    3. 通过调用TerminateProcess 强制终止进程。

    【讨论】:

    • 谢谢@David。你证实了我的恐惧。看来我必须使用大锤并使用 taskkill.exe /F /IM MyApp.exe
    • 你为什么要对外部流程做这么多?为什么不能调用 API 函数。
    • 确实!由于我以前没有使用过管道和螺纹,所以我走神了,想研究一下。
    • "WriteConsoleInput" 可以将功能键写入控制台输入缓冲区,可以发送带有虚拟键代码的键事件。但是,标准句柄一旦被重定向,就只能由“Read/WriteFile”使用。如果没有拥有控制台的进程的合作,我想不出任何方法来获取输入缓冲区句柄。 OP 在控制台和管道上有很多要阅读的内容,以了解它是否真的可行。
    猜你喜欢
    • 1970-01-01
    • 2019-01-20
    • 2010-10-23
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    相关资源
    最近更新 更多