2009-04-07 9 views
2

Comment vérifier si une autre application est occupée?déterminer si une autre application est occupée

J'ai un programme qui envoie du texte à une console. Le texte que je vais envoyer contient # 13 char (par exemple ls#13cd documents#13dir). En d'autres termes, je veux envoyer plusieurs commandes en même temps et la console les traitera une par une. J'envoie le caractère de caractère par caractère. Parfois, la console exécute uniquement ls et cd documents. Je pense que c'est peut-être parce que mon programme envoie continuellement des caractères même si la console est occupée, auquel cas la console ne reçoit pas les caractères entrants.

Ceci est mon code:

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; 

J'utilise Delphi 7.

+0

S'il vous plaît, éditez votre question et formatez le code, en utilisant le bouton "Exemple de code" –

Répondre

5

Si j'interprète vous correctement à la question que vous envoyez le texte à une sorte d'interpréteur de ligne shell/commande et vous le voulez pour exécuter vos commandes.

Habituellement, les interpréteurs en ligne de commande affichent un certain message (comme $ sur un système Linux ou C: \ pour DOS) indiquant qu'ils peuvent accepter de nouvelles commandes. Vous devez lire la sortie pour attendre l'invite appropriée avant d'envoyer une autre commande. Si vous ne saisissez pas votre texte envoyé en entrée par la commande en cours d'exécution (comme vous l'avez expérimenté).

+0

oui, c'est ce que je pense, mais comment? Voulez-vous dire après l'envoi d'un personnage, je vais lire la sortie de la console? Je ne pense pas que ce soit idéal. J'ai lu sur WaitforInputIdle.But j'utilise shellexecute pour ouvrir la console. Donc ça ne marchera pas pour moi. – junmats

+0

lothar, j'ai essayé votre suggestion mais le seul texte que je peux copier sont ceux que j'ai saisis. Je ne peux pas copier le texte prédéfini (c'est-à-dire c: \\). Savez-vous de telle sorte que va copier tout le texte à l'intérieur de la console? Votre aide sera très appréciée. – junmats

+0

Je pense que le dépassement est juste. Vous devez démarrer l'interpréteur de commandes en tant que processus dans lequel vous pouvez lire et écrire l'entrée et la sortie, par ex. un tuyau. Ce serait beaucoup plus facile. – lothar

0

Je pense que je comprends ce qui se passe, pas que j'ai une solution pour elle:

Vous envoyez une commande à la console. Pendant que la commande est en cours d'exécution ce programme recevra les clés que vous envoyez.

3

lothar est sur la bonne voie; ce que vous voulez faire est, au lieu d'utiliser ShellExecute, utilisez CreateProcess. Regardez autour de Stack Overflow et Google pour "Console Redirection" - cela vous permettra de trouver ce que vous cherchez.

Questions connexes