Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: variable système HANDLE_APPLICATION Dim 29 Mai 2016 - 23:18 | |
| Pour diverses raisons techniques, j'aurais besoin de connaître le handle de l'application (Application.Handle en Delphi), du programme Panoramic. Ceci est bien entendu différent du handle de la form 0. Alors, j'aimerais avoir une variable système HANDLE_APPLICATION (ou une fonction HANDLE_APPLICATION sans paramètres), retournant cette valeur. Je pourrais ainsi passer cette valeur à ma DLL via une fonction d'initialisation, la mémoriser dans une variable interne à la DLL et l'utiliser en cas de besoin. | |
|
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 30 Mai 2016 - 13:33 | |
| Tout ce qui peut faire avancer KGF, je suis pour. donc +1 | |
|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: variable système HANDLE_APPLICATION Lun 30 Mai 2016 - 16:14 | |
| Salut tout le monde @Klaus J’ai trouvé ce code en delphi qui permet de lancer ou récupérer le handle d'une application. Je l’ai testé pour lancer la calculatrice (calc.exe), le bloc-notes (notepad.exe), Panoramic_Editor.exe, etc.. - Code:
-
unit Unit1;
//EXEMPLE POUR LANCER OU RECUPERER LA FENETRE D'UNE APLICATION} // Cet exemple montre comment executer un programme ou récupérer la fenetre handle // si celui-ci est déjà lancé executé.
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, // Rajouter ces deux unites à la clause USES TLHelp32, ShellAPI;
type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject); begin Edit1.Text := 'C:\Users\acer\Desktop\Panoramic\Panoramic_Editor_V_0.9.27i7.exe'; end;
// RENVOIE L'ID DU PROCESS //------------------------ Function ExeRunning (NomApplication : string) : Cardinal; var ProcListExec : TProcessentry32; PrhListExec : Thandle; Flag : Boolean; begin Result := 0; // on definit la taille du processus ProcListExec.dwSize:=sizeof(ProcListExec); Try // on prend une photo des processus en cours PrhListExec := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0); if (PrhListExec <> INVALID_HANDLE_VALUE) then begin Flag := True; // on liste les process à la maniere d'un FINDFIRST} Process32First(PrhListExec,ProcListExec); while Flag = True do begin //on compare le nom des deux executable, si c'est les même on a trouvé le numéro du processus if (Uppercase(ExtractFileName(ProcListExec.szExeFile)) = Uppercase(ExtractFileName (NomApplication))) then Begin Result := ProcListExec.th32ProcessID; Flag := False; end else Flag := Process32Next(PrhListExec,ProcListExec); end; end; Finally CloseHandle(PrhListExec); end; end;
// ENUMERATION DES FENETRES PAR RAPPORT AU PROCESS function EnumByProcess(handeul : HWND; lParam : Cardinal): boolean; stdcall; var pPid : LPDWord; begin if handeul <> 0 then begin // On recupere le numero de process d'apres le handle que nous renvoie ENUMWINDOWS GetWindowThreadProcessId(handeul,pPid); // Si les deux numero de processus coincide if pPid^ = LParam then // Et si la fenetre PEUT etre visible par l'utilisateur alors on l'affiche if IsWindowVisible (handeul) then ShowWindow (Handeul, SW_RESTORE); result := true; end else Result := False end;
procedure TForm1.Button1Click(Sender: TObject); Var ExecTmp : Array[0..254] of Char; Executable : PChar; IdProcess : Cardinal; begin FillChar (ExecTmp, SizeOf (ExecTmp),0); IdProcess := ExeRunning (Edit1.Text); if IdProcess = 0 then Begin StrPLCopy(ExecTmp,Edit1.Text,Length (TRIM(Edit1.Text))); Executable := @ExecTmp; // Cet exemple n'utilise que des programmes sans parametre et sans // répertoire de travail specifique ShellExecute (Handle,'open',Executable, Nil, Nil,SW_SHOWMAXIMIZED); End else EnumWindows(@EnumByProcess,IdProcess); end;
end.
| |
|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: variable système HANDLE_APPLICATION Lun 30 Mai 2016 - 18:53 | |
| Merci de ton aide, Papydall. Je connaissais ce code, et il est d'ailleurs intégré dans certaines fonctions de KGF.dll. Mais le gros problème, c'est qu'il donne le handle de la fenêtre principale, pas celui de l'application !
Tu me diras "mais quelle est la différence" ? Eh bien, cela tient à une particularité de Delphi. Depuis les débuts de Delphi, une fenêtre entièrement cachée est créée. Cette fenêtre s'appelle "application". C'est peu comme un "parking window" dans d'autres types d'application, comme Word, Firefox etc. C''est cette fenêtre nommée application qui analyse et traire tous les messages Windows qui sont envoyés à un programme Delphi, avant éventuellement de les dispatcher aux objets subordonnées. Le premier de ces objets subordonnés est la form 0, qui est une form Windows sans parent, mais gérée par la fenêtre application.
Tout ceci est géré automatiquement par le programme Delphi généré par le compilateur. Ceci permet par exemple d'avoir un programme Delphi sans GUI (sans fenêtre ni autres objets visibles), s'exécutant en arrière-plan sans interaction avec l'utilisateur, et pourtant capable de recevoir des messages Windows et d'y réagir.
Or, dans sa version Windows, Panoramic est réalisé en Delphi. Et donc, tout programme Panoramic créé par l'éditeur Panoramic est en réalité un programme Delphi (l'interpréteur ou le noyau) avec des données représentant le code source Panoramic. Et dans certains cas, il faut connaître le handle de la fenêtre cachée du programme qui est la véritable base du programme. Juste un exemple: pour accéder à l'icône du programme Panoramic dans la barre des tâches de Windows (pour la cacher, la faire pulser, lui donner un menu contextuel, ...), il faut absolument connaître le handle de l'application. Celui de la form 0 ne fait pas l'affaire. Mais des exemples comme ça, il y en a plein.
Voici ce qui justifie ma requête auprès de Jack. | |
|
Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: variable système HANDLE_APPLICATION Lun 30 Mai 2016 - 19:06 | |
| Je suis en train de coder HANDLE_APPLICATION qui fera son apparition à la prochaine version instantanée. _________________ username : panoramic@jack-panoramic password : panoramic123 | |
|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: variable système HANDLE_APPLICATION Lun 30 Mai 2016 - 19:18 | |
| Super ! Merci beaucoup, Jack ! | |
|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: variable système HANDLE_APPLICATION Lun 30 Mai 2016 - 21:07 | |
| Jack is handling the handle. Good news ! | |
|
Contenu sponsorisé
| Sujet: Re: variable système HANDLE_APPLICATION | |
| |
|