IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Comment obtenir le nom d'une application active à partir de son Handle ?


Sujet :

Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Comment obtenir le nom d'une application active à partir de son Handle ?
    Bonjour,

    Grace à des sources proposées par la FAQ Developpez.com j'ai pu récupérer la liste des Handles des applications actives sous Windows.

    Comment trouver le nom de l'application à partir de son Handle ?

    Merci à tous

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Citation Envoyé par colorid Voir le message
    Comment trouver le nom de l'application à partir de son Handle ?
    Si par le nom de l'application tu entends le nom de l'exécutable, je te propose cette fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    uses TlHelp32;
     
    function GetProcessNameFromHandle(Handle:HWND):string;
    var
      Pid: DWord;
      SnapShot: HWND;
      Module: TModuleEntry32;
    begin
      Result := '';
      if not IsWindow(Handle) then exit;
      GetWindowThreadProcessId(Handle, @Pid); // récupere le pid
      Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, Pid); // creer un snapshot sur le pid
      try
        if Snapshot<>-1 then
        begin
          Module.dwSize := SizeOf(TModuleEntry32);
          if Module32First(Snapshot,Module) then result:=Module.szExePath; // recupere l'exe path
        end;
      finally
        CloseHandle(Snapshot);
      end;
    end;
    Si mes souvenirs sont bons, j'avais du récupérer cette fonction chez Phildels.

    @+ Claudius

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut
    Voici le code proposé par la FAQ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    function EnumWindowsProc(hwnd: HWND; lParam: LPARAM): boolean; stdcall;
    var
    dwProcessId: DWORD;
    begin
    if lParam <> 0 then
    begin
    GetWindowThreadProcessId(hwnd, dwProcessId);
    with PFindWindowsStruct(lParam)^ do
    if dwProcessID = ProcessID then
    HandleList.Add(Pointer(hwnd));
    result:= true;
    end
    else
    result:= false;
    end;
     
    procedure FindProcessWindows(ProcessID: Integer; Handles: TList);
    var
    findWindowsStruct: TFindWindowsStruct;
    begin
    findWindowsStruct.ProcessID:= ProcessID;
    findWindowsStruct.HandleList:= Handles;
    EnumWindows(@EnumWindowsProc, Integer(@findWindowsStruct));
    end;
     
    procedure TForm1.FormShow(Sender: TObject);
    var
    handles: TList;
    i: Integer;
    begin
    Caption:= Format('Application : %d , Fenêtre courante : %d',
    [Application.Handle, Handle]);
     
    handles:= TList.Create;
    Try
    FindProcessWindows(GetCurrentProcessID, handles);
    memo1.lines.Clear;
    for i:= 0 to handles.Count - 1 do
    // Memo1.Lines.Add(IntToStr(Integer(Handles[i]))+':'+GetProcessNameFromHandle(Handles[i]));
    Memo1.Lines.Add(IntToStr(Integer(Handles[i])));
    Finally
    handles.Free;
    End;
    ListerModules(Listbox1);
    end;
    Si je libère la ligne placée en remarque je génère l'erreur :

    E2010 Types incompatibles : HWND et Pointer

    Comment y remédier ?

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Re,

    Essaye d'adapter ce code qui est fonctionnel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    var
      Form1: TForm1;
     
    function EnumWindowsCallback(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
     
    implementation
     
    {$R *.DFM}
     
    uses TlHelp32;
     
    //------------------------------------------------------------------------------
    function GetProcessNameFromHandle(Handle: HWND):string;
    var
      Pid, SnapShot: Cardinal;
      Module: TModuleEntry32;
    begin
      Result := '';
      if not IsWindow(Handle) then exit;
      GetWindowThreadProcessId(Handle, @Pid); // récupere le pid
      Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, Pid); // creer un snapshot sur le pid
      try
        if Snapshot > 0 then
        begin
          Module.dwSize := SizeOf(TModuleEntry32);
          if Module32First(Snapshot,Module) then result:=Module.szExePath; // recupere l'exe path
        end;
      finally
        CloseHandle(Snapshot);
      end;
    end;
    //------------------------------------------------------------------------------
    function EnumWindowsCallback(hWnd: HWND; lParam: LPARAM): BOOL;
    begin
      Form1.Memo1.Lines.Add('Handle: ' + IntToStr(hWnd) +
                            '  Exécutable : '+GetProcessNameFromHandle(hWnd));
      result := True;
    end;
    //------------------------------------------------------------------------------
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Memo1.Clear;
      EnumWindows(@EnumWindowsCallback, 0);
    end;
    @+

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Ok cela marche mais petit problème
    Cela fonctionne très bien, même trop bien.

    Il trouve 349 Handles ! Pas moins !
    Tous les exe lancés par Windows avec plusieurs Handles pour un même exe...
    Rien que pour InternetExplorer j'ai noté 8 handles ! (je n'ai que 2 instances ouvertes) Pour RadStudio 4 ou 5 handles (1 instance) et pour l'exécutable compilé et lancé 2 handles (1 instance) !!!

    J'ai donc la réponse à ma question. Mille merci...

    Mais comment trouver le bon Handle ? Mon problème est de faire afficher la fenêtre ouverte par un executable spécifique lancé précedemment à mon application devant celle de mon application qui obligatoirement se trove plein écran.

    Vois-tu par quel moyen ?

Discussions similaires

  1. Comment faire des etats pour une application web ?
    Par ovh dans le forum Autres outils décisionnels
    Réponses: 6
    Dernier message: 06/07/2021, 03h25
  2. Comment obtenir la sélection de l'application active?
    Par javamaniac dans le forum Windows
    Réponses: 1
    Dernier message: 22/12/2006, 22h17
  3. Obtenir le nom d'un proces a partir de son PID
    Par Visiteur_33 dans le forum Windows
    Réponses: 6
    Dernier message: 16/02/2006, 11h03
  4. Comment obtenir le nom d'un pc sur un réseau?
    Par Depteam1 dans le forum MFC
    Réponses: 2
    Dernier message: 19/02/2004, 10h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo