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

Langage Delphi Discussion :

[Delphi2005]récuperer le contenu d'un Edit Handle


Sujet :

Langage Delphi

  1. #1
    Membre averti Avatar de shell13010
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2008
    Messages : 281
    Points : 314
    Points
    314
    Par défaut [Delphi2005]récuperer le contenu d'un Edit Handle
    Salut tout le monde!!

    Alors mon probleme viens du fait que j'ai un programme1 avec un Edit1,

    et j'ai recuperer l'handle de l'application et j'arrive a envoyer des commandes

    mais par contre je sais pas comment je pourrais recuperer le contenu du Edit1 de programme1 dans mon programme2 ?

    Auriez vous une idée?

    Merci d'avance pour votre aide.
    "Quelle prétention de prétendre que l'informatique est récente: Adam et Eve avaient déjà un Apple!"

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Essaye avec WM_GETTEXT
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti Avatar de shell13010
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2008
    Messages : 281
    Points : 314
    Points
    314
    Par défaut
    salut ShaiLeTroll

    merci je vais tester sa de suite..

    Edit: Bon j'ai un souci car je n'arrive pas a faire fonctionner la 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
    function GetEditText(const AppClass, EditClass: string; EditIndex: Integer; out Text: string): Boolean;
      var hWndApp, hEdit: HWND;
          buffer: array[0..4095] of char;
      const BUF_SIZE = 4096;
      begin
         result := False;
         hWndApp:= FindWindow(PChar('APP1'), nil); //ici l'Handle de l'application externe si je me trompe pas?
         if (hWndApp<> 0) then
         begin
           hEdit := FoundChild(hWndWord, PChar('Edit'), nil, EditIndex); //ici je suppose que c'est l'Edit?
           if (hEdit <> 0) then //ici teste si bon envoie...
           begin
               Sendmessage(hEdit,WM_GETTEXT, BUF_SIZE , Cardinal(@buffer));
               result := True;
               Text := buffer;
           end;
         end;
      end;
    voila les erreurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [Erreur] Unit2.pas(40): E2003 Identificateur non déclaré : 'FoundChild'
    [Erreur] Unit2.pas(40): E2003 Identificateur non déclaré : 'hWndWord'
    pourrez tu me dire si je me suis tromper car je nage un peu sur les Handles ?

    Merci d'avance.
    "Quelle prétention de prétendre que l'informatique est récente: Adam et Eve avaient déjà un Apple!"

  4. #4
    Membre averti Avatar de shell13010
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2008
    Messages : 281
    Points : 314
    Points
    314
    Par défaut
    Salut..

    Personne ne peut m'aider pour mon probléme?

    Car je n'arrive toujours pas a le faire marcher

    Merci d'avance pour votre aide..
    "Quelle prétention de prétendre que l'informatique est récente: Adam et Eve avaient déjà un Apple!"

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    Salut,

    regarde cette discution
    Ça devrait t'aider.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    J'avais pas mis FoundChild, c'est une fonction d'un autre sujet, c'est vrai
    Cela permet de parcourir tout l'arbre des enfants d'une fenêtre

    Effectivement, ce n'est pas un code fonctionnel, c'est plus un exemple tapé directement sur le forum, d'où la coquille hWndWord au lieu de hWndApp

    sinon ne modifie pas GetEditText, c'est l'intéret d'une fonction d'être polyvalente, il suffit juste de l'appeler avec les bons paramètres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetEditText('APP1', 'Edit', 0, UneChaineLocale);
    Bon, je suppose qu'entre temps, tu as lu l'aide SDK des API Windows tel que
    GetWindow, FindWindow, ...


    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
    function FoundChild(Parent: THandle; const ClassName, WindowName: string; ChildIndex: Integer = 0): THandle;
    var
       HandleFound: THandle;
       lpRes : array[0..256] of Char;
       StrClass: string;
       StrCaption: string;
       iChild: Integer;
    begin
       Result := 0;
       iChild := -1;
     
       HandleFound := GetWindow(Parent, GW_CHILD);
       while HandleFound > 0 do
       begin
          GetClassName(HandleFound, lpRes, SizeOf(lpRes));
          StrClass := lpRes;
          GetWindowText(HandleFound, lpRes, SizeOf(lpRes));
          StrCaption := lpRes;
     
          if ((ClassName = '') or SameText(ClassName, StrClass)) and ((WindowName = '') or SameText(WindowName, StrCaption)) then
          begin
             Inc(iChild);
             if iChild >= ChildIndex then begin
                Result := HandleFound;
                Exit;
             end;
          end else
          begin
             Result := FoundChild(HandleFound, ClassName, WindowName, ChildIndex);
             if Result > 0 then Exit;
          end;
     
          HandleFound := GetWindow(HandleFound, GW_HWNDNEXT);
       end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Je ne vois pas l'intérêt de la chose ...Il n'est pas possible pour récupérer le nom d'un TEdit avec les fonction FindWindow,FindWindowEx,Getwindowtext

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Que veux-tu dire Montor ?
    On ne cherche pas a récupérer le nom mais le contenu d'un Edit en fonction de son handle ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Citation Envoyé par ShaiLeTroll
    Que veux-tu dire Montor ?
    On ne cherche pas a récupérer le nom mais le contenu d'un Edit en fonction de son handle ?
    Au moment on sait a quel contrôle appartenait le handle le problème est déjà réglé ... pour une raison ou une autre ce type de contrôles ont la tendance pour cacher leur noms... si il est honnête il peut utiliser une message windows

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    d'où l'idée du FoundChild ou l'on spécifie l'index de l'Edit, j'ai été confronté à ce problème, je voulais modifier le texte du 3eme edit d'un écran, je n'ai trouvé que ce moyen ... trouver tous les Edit, et continuer jusqu'à un index précis

    Je pense qu'il faut que shell13010 étudie un peu toutes les fonctions comme FindWindow ou GetWindowText, pour trouver le Handle de la Fenêtre contenant l'Edit puis GetWindow utilisé récursivement pour trouver cet Edit

    J'ai fait ce genre de chose avec ces API, on peut explorer pas mal de chose dans Windows, et ce que j'ai fait n'est absolument rien par rapport à tout ce que l'on peut vraiement obtenir
    Je suis parti d'un Exemple de Phidels et j'y ai rajouté quelques trucs comme ce TreeView
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Elle est superbe la démonstration ...je peux donner une autre piste plus pratique et aussi j'aimerai te poser une question existe-il un problème avec la foncton EnumChildWindows,FindWindowEx ?
    unit1.pas
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Mask, ExtCtrls;
     
    type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        HEdit: TEdit;
        ClassEdit: TEdit;
        TextEdit: TEdit;
        IdxEdit: TEdit;
        Label4: TLabel;
        UPEdit: TEdit;
        Label5: TLabel;
        UPCEdit: TEdit;
        Label6: TLabel;
        Panel2: TPanel;
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
    type
       TFResult=record
          H:HWND;
          Idx,Ps:integer;
       end;
       PFResult =^TFResult;
    var
      Pv:HWND;
     
    procedure FocusRect(Hd:HWND);
    var
        R:TRect;
        DC:HDC;
    begin
        DC := GetWindowDC(Hd);
        GetClipBox(DC,R);
        InflateRect(R,-1,-1);
        DrawFocusRect(DC,R);
        ReleaseDc(Hd,DC);
    end;
     
    function WinClassName(Hd:HWND):string;
    begin
        SetLength(result,255);
        SetLength(result,GetClassName(Hd,PChar(result),255));
    end;
     
    function WinTxt(Hd:HWND):string;
    begin
        SetLength(result,255);
        SetLength(result,GetWindowText(Hd,PChar(result),255));
    end;
     
    function GetFirstParent(Control: HWND): HWND;
    begin
      result:= Control;
      repeat
         Control:=GetParent(Control);
         if Control = 0 then
            Exit;
         result:= Control;
      until False;
    end;
     
    function ChildIdx(HParent,HChild:HWND):integer;
        function EnumChildProc(Hd:HWND;Param:PFResult):BOOL;stdcall;
        begin
          inc(Param^.Ps);
          if Param^.H = Hd then
             Param^.idx := Param^.Ps;
           result:= Param^.idx = -1;
        end;
    var
      Sr:TFResult;
    begin
      Sr.Idx  :=-1;
      Sr.Ps:=-1;
      Sr.H :=HChild;
      EnumChildWindows(HParent,@EnumChildProc,DWORD(@Sr));
      result:=Sr.Ps
    end;
     
    procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var
      H,PC,CH:HWND;
      M:TPoint;
    begin
      if not (ssLeft in Shift) then Exit;
      if PtinRect(ClientRect,Point(X,Y)) then Exit;
      M:=Mouse.CursorPos;
      CH:= WindowFromPoint(Mouse.CursorPos);
      Windows.ScreentoClient(CH,M);
      H:=   ChildWindowFromPointEx(CH,M,CWP_ALL);
      if H =0 then
         H:=CH;
      if Pv <> H then
      begin
        FocusRect(Pv);
        FocusRect(H);
        PC :=GetFirstParent(CH);
        HEdit.Text := '$'+IntToHex(H,8);
        ClassEdit.Text:=WinClassName(H);
        TextEdit.Text:=WinTxt(H);
        IdxEdit.Text:=IntToStr(ChildIdx(PC,H));
        UPEdit.Text:='$'+IntToHex(PC,8);;
        UPCEdit.Text:=WinClassName(PC);
        Pv := H;
      end;
    end;
     
    procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      FocusRect(Pv);
    end;
     
    end.
    unit1.dfm
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    object Form1: TForm1
      Left = 0
      Top = 0
      Width = 219
      Height = 249
      Cursor = crHandPoint
      Caption = 'Form1'
      Color = clCream
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      FormStyle = fsStayOnTop
      OldCreateOrder = False
      Position = poDesktopCenter
      OnMouseMove = FormMouseMove
      OnMouseUp = FormMouseUp
      PixelsPerInch = 96
      TextHeight = 13
      object Panel1: TPanel
        Left = 0
        Top = 0
        Width = 211
        Height = 161
        Align = alTop
        BevelOuter = bvNone
        Color = clActiveBorder
        ParentBackground = False
        TabOrder = 0
        object Label1: TLabel
          Left = 35
          Top = 11
          Width = 34
          Height = 13
          Caption = 'Handle'
        end
        object Label2: TLabel
          Left = 19
          Top = 35
          Width = 51
          Height = 13
          Caption = 'Classname'
        end
        object Label3: TLabel
          Left = 51
          Top = 59
          Width = 21
          Height = 13
          Caption = 'Text'
        end
        object Label4: TLabel
          Left = 43
          Top = 83
          Width = 26
          Height = 13
          Caption = 'Index'
        end
        object Label5: TLabel
          Left = 11
          Top = 107
          Width = 60
          Height = 13
          Caption = 'UltimeParent'
        end
        object Label6: TLabel
          Left = 3
          Top = 133
          Width = 66
          Height = 13
          Caption = 'UPClassname'
        end
        object HEdit: TEdit
          Left = 81
          Top = 8
          Width = 121
          Height = 21
          ReadOnly = True
          TabOrder = 0
        end
        object ClassEdit: TEdit
          Left = 81
          Top = 32
          Width = 121
          Height = 21
          ReadOnly = True
          TabOrder = 1
        end
        object TextEdit: TEdit
          Left = 81
          Top = 56
          Width = 121
          Height = 21
          ReadOnly = True
          TabOrder = 2
        end
        object IdxEdit: TEdit
          Left = 81
          Top = 80
          Width = 121
          Height = 21
          ReadOnly = True
          TabOrder = 3
        end
        object UPEdit: TEdit
          Left = 81
          Top = 104
          Width = 121
          Height = 21
          ReadOnly = True
          TabOrder = 4
        end
        object UPCEdit: TEdit
          Left = 81
          Top = 130
          Width = 121
          Height = 21
          ReadOnly = True
          TabOrder = 5
        end
      end
      object Panel2: TPanel
        Left = 0
        Top = 161
        Width = 211
        Height = 54
        Align = alClient
        Caption = 'Cliquer  pointer sur un control '
        Enabled = False
        TabOrder = 1
      end
    end
    utilisation cliquer sur la partie jaune et maintenis la souris enfonce et pointer sur les controls d'une autre applis

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Citation Envoyé par Montor Voir le message
    existe-il un problème avec la foncton EnumChildWindows, FindWindowEx ?
    Pour FindWindowEx, j'ai un vague souvenir d'avoir eu un problème si je cherchains que le text alors qu'ave avec GetWindow GW_HWNDNEXT, je m'en suis toujours bien sorti, c'est un truc à retester, j'avais surement mal fait un truc, car avec FindWindowEx, je pourrais ré-écrire FoundChild et elle serait nettement plus courte !

    Pour EnumChildWindows, son gros problème c'est l'utilisation récursif, c'est possible mais ce n'est pas fait pour, tu vas récupérer pour un Handle tous ses Enfants ET sous-Enfants, ce qui n'est pas pratique pour un Affichage en Arbre. Contrairement à GetWindow qui va te donner QUE les Enfants directs de la Fenêtre ce qui permet d'avoir juste ce qui est nécessaire

    Ce qui me gène aussi, c'est le CallBack, c'est pénible, faut passer tout le contexte dans lParam, même en sous-fonction d'une méthode, Self n'est pas accessible parce que Delphi se marche sur les pieds avec stdcall !

    Comme on dit tous les chemins mène à Rome !
    Chacun prend la route qu'il préfère !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #13
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    l'utilisation de GetWindow en récursive est déconseillée selon le MSDN

    Ce qui me gène aussi, c'est le CallBack, c'est pénible, faut passer tout le contexte dans lParam, même en sous-fonction d'une méthode, Self n'est pas accessible parce que Delphi se marche sur les pieds avec stdcall !
    Tu peux passer des objets pas IParam et travailler a l aise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function EnumChildProc(Hd:HWND;Param:TForm):BOOL;stdcall;
     
    EnumChildWindows(HParent,@EnumChildProc,DWORD(Self));

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Je ne savais pas pour GetWindow, cela m'étonne, c'est justement l'intérêt de cette fonction à place de EnumChildWindows qui ne convient pas pour le recursif !

    c'est un peu comme Items du TTreeNodes (EnumChildWindows qui donne tous les nodes et Items d'un TTreeNode (pas de s, GetWindow) qui ne donne que ses enfants

    Euh @Self ??? tu es sur ? je n'aurais pas mis @, car tu passes dans LParam le pointeur sur la Référence Self et non la Référence !
    Tu devrais tester !

    Je préfère être propre, surtout qu'ainsi on peut externaliser le code et l'utiliser dans plusieurs applications tant que l'on passe les bons arguments dans le contexte

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    procedure TFrmFullEnumWindows.BtnEnumWindowsClick(Sender: TObject);
    type
      PEnumWindowsCallBackContext = ^TEnumWindowsCallBackContext;
      TEnumWindowsCallBackContext = record
        TreeNodes: TTreeNodes;
        ParentNode: TTreeNode;
        RecurseMode: Boolean;
        HierarchicMode: Boolean;
        HierarchicParent: HWND;
      end;
     
      function EnumWindowsCallBackProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall; forward;
     
      procedure AddWindowNode(Context: PEnumWindowsCallBackContext; hWnd: HWND; const S: string);
      var
        ChildNode: TTreeNode;
        ChildContext: TEnumWindowsCallBackContext;
      begin
         ChildNode := Context.TreeNodes.AddChildObject(Context.ParentNode, S, Pointer(hWnd));
         if Context.RecurseMode then
         begin
           ChildContext := Context^;
           ChildContext.ParentNode := ChildNode;
           ChildContext.HierarchicParent := hWnd;
     
           EnumChildWindows(hWnd, @EnumWindowsCallBackProc, LPARAM(@ChildContext));
         end;
      end;
     
      function EnumWindowsCallBackProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
      var
        WindowClassName: array[0..255] of Char;
        WindowText: string;
        WindowTextLen: Integer;
        Context: PEnumWindowsCallBackContext absolute lParam;
      begin
        Result := Context.HierarchicMode or (Context.ParentNode.Level < 2);
        if not Result then
          Exit;
     
        if not Context.HierarchicMode or (GetParent(hWnd) = Context.HierarchicParent) then
        begin
          if GetClassName(hWnd, WindowClassName, SizeOf(WindowClassName)) > 0 then
          begin
            WindowTextLen := GetWindowTextLength(hWnd);
            if WindowTextLen > 0 then
            begin
              SetLength(WindowText, WindowTextLen);
              if GetWindowText(hWnd, @WindowText[1], WindowTextLen + 1) > 0 then
                AddWindowNode(Context, hWnd, Format('%s : "%s" [%d]', [WindowClassName, WindowText, hWnd]))
              else
               AddWindowNode(Context, hWnd, Format('%s : ? [%d]', [WindowClassName, hWnd]));
            end
            else
              AddWindowNode(Context, hWnd, Format('%s [%d]', [WindowClassName, hWnd]));
          end
          else
           AddWindowNode(Context, hWnd, Format('[%d]', [hWnd]));
        end;
      end;
     
    var
      Context: TEnumWindowsCallBackContext;
    begin
      TreeView.Items.BeginUpdate();
      try
        TreeView.Items.Clear();
     
        Context.TreeNodes := TreeView.Items;
        Context.ParentNode := TreeView.Items.AddChild(nil, 'Root');
        Context.RecurseMode := CheckBoxEnumWindowsAuto.Checked;
        Context.HierarchicMode := CheckBoxEnumWindowsHierarchic.Checked; // GetWindow utilisé par ArbreEnfant est plus pratique pour ce cas !
        Context.HierarchicParent := 0;
     
        EnumWindows(@EnumWindowsCallBackProc, LPARAM(@Context));
     
        TreeView.AlphaSort();
      finally
        TreeView.Items.EndUpdate();
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  15. #15
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Je ne savais pas pour GetWindow, cela m'étonne, c'est justement l'intérêt de cette fonction à place de EnumChildWindows qui ne convient pas pour le recursif !
    c'est pas grave le risque vient si des contrôles seront détruites on ne peut pas sortir de boucle .

    Citation Envoyé par ShaiLeTroll
    Euh @Self ??? tu es sur ? je n'aurais pas mis @, car tu passes dans LParam le pointeur sur la Référence Self et non la Référence !
    Tu devrais tester !
    Je vais corriger l'erreur j 'avais juste copier /coller le code de mon précédente poste mais je t'assure il fonctionne
    Voici un autre exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function EnumChildProc(Hd:HWND;Param:TList):BOOL;stdcall;
    begin
       Param.Add(Pointer(Hd));
       Result:=true;
      ....     
    EnumChildWindows(HParent,@EnumChildProc,DWORD(Liste));
    la fonction EnumChildWindows, échoue avec les fiche crées avec la propriété BorderStyle bsNone,bsDialog c'est le cas aussi "pas sur" avec GetWindow

Discussions similaires

  1. Récuperer le contenu d'un Edit Text
    Par scholes dans le forum Interfaces Graphiques
    Réponses: 14
    Dernier message: 02/05/2008, 16h34
  2. Réponses: 3
    Dernier message: 04/09/2006, 08h55
  3. Récuperation du contenu binaire d'une variable
    Par laetous dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 23/07/2006, 18h09
  4. [API Win32 sans MFC] Ajouter et récuperer du texte d'un EDIT
    Par dacid dans le forum Bibliothèques
    Réponses: 5
    Dernier message: 17/05/2006, 17h45
  5. Alignement du contenu d'un edit à droite
    Par bertrand_declerck dans le forum Composants VCL
    Réponses: 3
    Dernier message: 17/11/2004, 14h39

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