2017-01-10 1 views
0

Как я могу заставить Delphi передать F4 во входной канал процессу CMD? Я использую код, который очень похож на ответ здесь: Pipes in Delphi for Command PromptОтправить F4 во входной канал CMD-процесс в Delphi

Для simpliity У меня есть только 4 объектов на форме: 1. CommandText (а ТМето, который отображает представление окна CMD). 2. CommandRun (TEdit, где вводится линия CMD). 3. SendBtn (TButton используется для отправки CommandRun.Text в CMD). 3. ExitBtn (TButton используется для выхода из программы).

Вот мои записи Трубопроводные Отправить процедуры:

Написать Pipe

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 через трубу и просто не могу понять, как этого добиться. Я был бы очень благодарен за любое руководство.

ответ

0

F4 не является чем-то, что будет передаваться через стандартный ввод. Это консольное приложение почти наверняка считывает ввод с клавиатуры напрямую.

Вам нужно будет найти другой способ решить эту проблему. Я предлагаю следующее:

  1. Убедитесь, что окно cmd имеет фокус ввода и фальшивый вход с F4 ключа. Я бы предположил, что перемещение фокуса в окно cmd было бы тем, что вы бы неохотно делали.
  2. Используйте другое средство, чтобы остановить этот процесс. Независимо от того, поддерживает ли процесс что-либо, кроме F4, нажатие на консольное окно не может быть определено здесь, поскольку мы ничего не знаем о рассматриваемом процессе.
  3. Обязательно прекратите процесс, позвонив по телефону TerminateProcess.
+0

Thanks @David. Вы подтвердили мои страхи. Похоже, мне придется использовать кувалду и использовать taskkill.exe/F/IM MyApp.exe – Paul

+0

Почему вы так много работаете с внешними процессами? Почему вы не можете вызывать функции API. –

+0

Действительно! Я получил побочные следы и хотел исследовать трубы и нитки, поскольку я раньше их не использовал. – Paul

Смежные вопросы