2

如何检查另一个应用程序是否正忙?

我有一个将文本发送到控制台的程序。我将发送的文本包含#13 字符(例如ls#13cd documents#13dir)。换句话说,我想一次发送许多命令,控制台会一一处理。我正在逐个字符地发送文本。有时控制台只执行lscd 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;

我正在使用德尔福 7。

4

3 回答 3

5

如果我正确地解释了您的问题,您就是将文本发送到某种 shell/命令行解释器,并且您希望它执行您的命令。

通常命令行解释器会输出一个特定的提示符(如 Linux 系统上的 $ 或 DOS 下的 C:\),表明它们可以接受新命令。在发送另一个命令之前,您需要阅读输出以等待适当的提示。如果您不这样做,您发送的文本将被当前运行的命令用作输入(就像您所经历的那样)。

于 2009-04-07T01:45:50.180 回答
3

洛塔尔走在正确的轨道上;你想要做的是,而不是使用 ShellExecute,使用 CreateProcess。环顾 Stack Overflow 和 Google 的“控制台重定向”——这会让你得到你想要的。

于 2009-04-07T03:48:59.307 回答
0

我想我明白发生了什么,而不是我有解决办法:

您向控制台发送命令。在命令运行时,该程序将接收您发送的密钥。

于 2009-04-07T03:37:28.367 回答