Comment appeler un processus déjà résident ?

Comment appeler un processus déjà résident ? - Delphi/Pascal - Programmation

Marsh Posté le 22-12-2006 à 09:40:43    

Bonjour.  
 
Je souhaiterais pouvoir appeler un programme déjà lancé. En loccurrence MailWasher, dont l'icône, en bas à droite, permet justement cet appel (mais ça ne m'est pas commode) :
 
http://membres.lycos.fr/a456765/icone.png
 
Il doit bien y avoir une API pour ça, mais laquelle :??: Une API (ou une fonction de D6) permettant l'activation d'un processus résident. Un peu comme le fait le gestionnaire de tâches avec l'onglet "Processus".  
 
Pas moyen de faire ça  :heink: ?  
 
Merci :hello:


Message édité par HERIBERT le 26-01-2007 à 15:10:55
Reply

Marsh Posté le 22-12-2006 à 09:40:43   

Reply

Marsh Posté le 22-01-2007 à 19:04:02    

j'ai pas compris !
le processus est deja lancé et toi tu veux lui changer de nom //impossible
sinon executer ?


---------------
http://www.deezer.com/track/1115801 Qu'est ce que la vie ? :(
Reply

Marsh Posté le 22-01-2007 à 20:50:15    

sad bloke a écrit :

j'ai pas compris !
le processus est deja lancé et toi tu veux lui changer de nom //impossible
sinon executer ?


Pas du tout :non:  
Je veux le faire passer au premier plan, en quelque sorte.  
Faire, en programmation, ce que je fais en doublecliquant sur l'icône de la barre des tâches.  
 
ET là, je ne vois pas du tout :??:

Reply

Marsh Posté le 22-01-2007 à 21:20:32    

ah ok bah essaye avec la commande show
 
form1.show


---------------
http://www.deezer.com/track/1115801 Qu'est ce que la vie ? :(
Reply

Marsh Posté le 22-01-2007 à 23:03:06    

sad bloke a écrit :

ah ok bah essaye avec la commande show
 
form1.show


On s'approche... mais c'est pas tout à fait ça :D
Le prog que je veux appeler (enfin : "activer" ) ne fait pas partie du prog qui l'appelle. Comment expliquer ça :/
 
Soit mon prog qui s'appelle TOTO.EXE . Soit un autre prog, en l'occurrence MailWasher. Celui-ci est "résident", comme on disait sous DOS. Il est déjà lancé, c'est un processus qui existe, et qui tourne. On le voir juste par la petit icône en bas à droite. En doublecliquant sur cette icône avec la souris, je l' "active".  
 
C'est exactement cela que je veux programmer : comme un double clic, mais sur un process existant.

Reply

Marsh Posté le 23-01-2007 à 10:01:10    

HERIBERT a écrit :

On s'approche... mais c'est pas tout à fait ça :D
Le prog que je veux appeler (enfin : "activer" ) ne fait pas partie du prog qui l'appelle. Comment expliquer ça :/
 
Soit mon prog qui s'appelle TOTO.EXE . Soit un autre prog, en l'occurrence MailWasher. Celui-ci est "résident", comme on disait sous DOS. Il est déjà lancé, c'est un processus qui existe, et qui tourne. On le voir juste par la petit icône en bas à droite. En doublecliquant sur cette icône avec la souris, je l' "active".  
 
C'est exactement cela que je veux programmer : comme un double clic, mais sur un process existant.


 
 
Essaye avec FindWindow puis ShowWindow puis SetWindowPos .
 
Exemple avec Yahoo Messenger
 
andl:= findwindow('YahooBuddyMain', nil);
SendMessage(andl, WM_SETFOCUS, 0 ,0 );
SendMessage(andl, WM_ACTIVATE , 0 , 0 );
ShowWindow(andl,SW_MINIMIZE);
ShowWindow(andl,SW_SHOWDEFAULT);
 
SetWindowPos(andl, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE
or SWP_NOACTIVATE or SWP_NOSIZE);
 


---------------

Reply

Marsh Posté le 24-03-2007 à 22:29:49    

Bonjour, bonjour
 
Je cherchai la même chose que toi et j'ai trouvé donc je te le poste.
mes sources : http://www.developpez.com/delphi/f [...] rexecution
 
j'ai fait un mix avec les deux solutions qu'il propose pour minimiser le code.
 

Code :
  1. program Project1;
  2. uses
  3.   Windows, Forms,
  4.   UnitMain in 'UnitMain.pas' {Form1};
  5. {$R *.res}
  6. var
  7. H         : THandle;
  8. Erreur    : Integer;
  9.     lsTitre   : string;
  10.     ClassName : array[0..255] of char;
  11. begin
  12. lsTitre := 'Nom_de_ton_appli';
  13. SetLastError(NO_ERROR);
  14. H := CreateMutex (nil, False, PChar(lsTitre));
  15. Erreur := GetLastError;
  16. if ( Erreur = ERROR_ALREADY_EXISTS ) or ( Erreur = ERROR_ACCESS_DENIED ) then
  17.     begin
  18.     GetClassName(Application.Handle, ClassName, 255);
  19.     { Restaurer l'application si minimisée }
  20.     ShowWindow(FindWindow(ClassName, PChar(lsTitre)), SW_RESTORE);
  21.     { Mettre la première instance en premier plan : }
  22.     SetForegroundWindow(FindWindow(ClassName, PChar(lsTitre)));
  23.     Exit;
  24.     end;
  25. Application.Initialize;
  26. Application.Title := 'Nom_de_ton_appli';
  27. Application.CreateForm(TForm1, Form1);
  28. Application.Run;
  29. CloseHandle(H)
  30. end.


 
Voilà j'espère que sa t'aidera et les autres qui passeront ici.
 
C'est la solution pour mettre au premier plan la première instance d'une application a la place de l'ouvrir une deuxième fois, lorsque l'on lance l'exécutable.
 
Voila by.
Pierre-Emmanuel.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed