определить, занято ли другое приложение - PullRequest
2 голосов
/ 07 апреля 2009

Как проверить, занято ли другое приложение?

У меня есть программа, которая отправляет текст на консоль. Текст, который я отправлю, содержит символ # 13 (например, ls#13cd documents#13dir). Другими словами, я хочу отправить много команд одновременно, и консоль будет обрабатывать их одну за другой. Я отправляю текст за символом. Иногда консоль выполняет только ls и cd documents. Я думаю, возможно, это потому, что моя программа непрерывно отправляет символы, даже если консоль занята, и в этом случае консоль не получает входящие символы.

Это мой код:

procedure TForm1.SendTextToAppO(Str: String; AHandle: Integer);
var
  iWindow, iPoint, i: Integer;
  SPass: PChar;
  sList: TStringList;
begin
sList := TStringList.Create;
  ExtractStrings([#13],[' '],PChar(Str),sList);
  iWindow := AHandle;// AHandle is the handle of the console
  iPoint := ChildWindowFromPoint(iWindow, Point(50,50));
  for i:=0 to sList.Count-1 do begin
    SPass := PChar(sList[i]);
    try
      while(SPass^ <> #$00) do begin
      SendMessage(iPoint,WM_CHAR,Ord(SPass^),0);
      Inc(SPass);
      end;
      SendMessage(iPoint,WM_KEYDOWN,VK_RETURN,0);
    except
        // do nothing;
    end;
  end;
end;

Я использую Delphi 7.

Ответы [ 3 ]

5 голосов
/ 07 апреля 2009

Если я правильно интерпретирую ваш вопрос, вы отправляете текст какому-то интерпретатору оболочки / командной строки и хотите, чтобы он выполнял ваши команды.

Обычно интерпретаторы командной строки выводят определенное приглашение (например, $ в системе Linux или C: \ для DOS), которое указывает, что они могут принимать новые команды. Вам нужно прочитать вывод, чтобы дождаться соответствующего приглашения, прежде чем отправлять другую команду. Если вы этого не сделаете, отправленный вами текст будет использован в качестве входных данных для текущей запущенной команды (как вы уже видели).

3 голосов
/ 07 апреля 2009

Лотар на правильном пути; вы хотите вместо ShellExecute использовать CreateProcess. Посмотрите вокруг переполнения стека и Google для "Перенаправление консоли" - это даст вам то, что вы ищете.

0 голосов
/ 07 апреля 2009

Мне кажется, я понимаю, что происходит, но у меня нет решения для этого:

Вы отправляете команду на консоль. Во время выполнения команды эта программа получит отправленные вами ключи.

...