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 :

Comment récupérer le Handle de la fenêtre sous ma Form ?


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Comment récupérer le Handle de la fenêtre sous ma Form ?
    Bonsoir,

    Je cherche à récuperer le Handle d'une fenetre (externe à mon appli) sur laquelle j'aurais déplacé la Form principale ded mon prog. J'ai bien trouvé comment récuperer cette info sous la souris ... mais pas sous une Form
    Si quelqu'un à la solution, je prends !

    merci

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 878
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 878
    Points : 15 310
    Points
    15 310
    Par défaut
    'lut !
    Citation Envoyé par GrosLuc Voir le message
    J'ai bien trouvé comment récuperer cette info sous la souris ... mais pas sous une Form
    Pas sous une Form, OK, mais pourquoi pas prendre l'endroit où la souris a lâché la Form ? Et tu rajoutes + 10 à gauche et à droite, tu rajoutes la hauteur de ta Form, et ça te fait un rectangle de sélection, style détecteur de métaux, .
    Ça pourrait le faire...
    --
    jp

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    'Lut aussi,

    Merci pour la réponse mais ca me convient pas vraiment, il faut que je puisse détecter le handle de la fenetre en dessous des qu'une toute partie de ma Form le recouvre (tu vois le probleme si la souris tient la Form en haut a gauche et que ma Form recouvre la fenetre du dessous en gaut à droite).

    Si quelqu'un a une autre idée ....

    merci

  4. #4
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,

    Je ne vais pas tester de suite ce que je vais poster a la suite (il est trop tard et je me fais vieux ), mais voici ce que j'essayerais (donc si ca se trouve non fonctionnel mais sa vaut le coup de tester peut être):
    . je récupère le RECT de ma form (qqchose comme GetWindowRect très certainement) -> j'ai donc mon 'rect1'
    . j'essaie de 'naviguer' a l'aide de GetWindow, en passant en premier paramètre le Handle de la form de mon appli, et en deuxième GW_HWNDNEXT.
    . je récupère le RECT de cette fenêtre (idem premier point), j'ai un 'rect2'
    . je teste si il y a chevauchement avec IntersectRect, en passant rect1 et rect2 en paramètre; si la valeur de retour n'est pas nulle c'est donc qu'il y a chevauchement et tu as le Handle de la form en dessous.

    Tout cela est dis 'sur le vif', a tester avec précautions, pas sur que ca tienne au bout du compte.

    @+

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Hello,

    Jolie (et rigolote) facon de trouver une solution. Ca m'avait pas traversé l'esprit ... du tout de le prendre comme ca !

    Je vais tester ca.

    Merci pour ce début de piste ...

  6. #6
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,
    Bon, j'espère que ma réponse n'a pas fait fuir sir GrosLuc. Je vais donc essayer de me rattraper, je n'ai pas eu le temps de le faire avant (je travaille un peu des fois, et un truc m'avait échappé).
    Adieu l'idée du GetWindow et cie (je m'étais un peu emballé sur ce coup, milles excuses), et vive le EnumWindows.

    Voici un bout de code dont on doit pouvoir " s'inpirer "(et pis corriger/embellir) (use it at your own risk ):
    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
     
    function GetAwindow(m_handle: HWND; Info: LParam): BOOL; stdcall;
    var
      rect1, rect2, rect_result : TRect;
      txt_form : pchar;
      txt_class : pchar;
      m_result : bool;
    begin
    m_result := True;
    txt_form:=StrAlloc(256);
    txt_class:=StrAlloc(256);
    GetWindowRect(Form2.Handle, &rect1);
                  GetWindowRect(m_handle, &rect2);
                  if (m_handle <> 0) and (m_handle <> GetActiveWindow()) then
                    begin
                    if (isWindowVisible(m_handle) = true) then
                      begin
                          if (IntersectRect(rect_result, rect1, rect2) = true) then
                            begin                       
                              GetWindowText(m_handle, txt_form, 256);
                              GetClassName(m_handle, txt_class, 256);
                              txt_all := txt_all + ' - ' + txt_form + (' (class: ') + txt_class + '). ';
                              m_result := False;
                            end;
                      end;
                    end;
    StrDispose(txt_form);
    StrDispose(txt_class);
    Result := m_result;
    end;
    //
    procedure TForm2.WndProc(var msg : TMessage);
    begin
    inherited WndProc(msg);
     
    case msg.Msg of
        WM_NCLBUTTONDOWN:
          begin
              EnumWindows(@GetAwindow, 0);
               ShowMessage(txt_all);
               txt_all:='';
          end;
    end;
    end;
    En espérant t'aider tout de même,
    @+

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Question il ne faudra pas des @ à la place des & plutôt ?

  8. #8
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Citation Envoyé par Aka Guymelef Voir le message
    Question il ne faudra pas des @ à la place des & plutôt ?
    Bonjour,

    Pour les GetWindowRect() ? Hé bien, je t'avouerais que vu que n'ayant pas de formation théorique en quoi que ce soit, il se peut que je fasse une erreur oui, et je suis toute ouie (dsl, je trouve pas le "i tréma" non plus sur mon clavier) pour une explication.

    @+


    NB: j'ai jeté un oeil ailleurs, et il semblerais même que dans ce contexte, je puisse même appeller plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     GetWindowRect(Form2.Handle, rect1);

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Et bien à priori l'opérateur & (référence d'objet ou adresse en C++ si je ne m'abuse) n'existe pas en Delphi, c'est l'opérateur @ qui remplit ce rôle.

    Maintenant ce n'est pas impossible d'appeler l'API en écrivant ainsi (à vérifier) mais là du coup je crains qu'il ne fasse une copie de l'objet plutôt de transmettre la référence ce qui est un peu du gâchis...

  10. #10
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Merci, effectivement c'est très certainement une déformation de ma part venant de C++Builder.

    Il faut donc alors appeller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    GetWindowRect(Form2.Handle, rect1);
         GetWindowRect(m_handle, rect2);
    //etc...
    afin de retomber sur des bases correctes donc ... (ok?).

    @+

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Après une petite recherche dans les sources de Delphi pour voir comment était utilisé cette API il s'avère qu'effectivement on utilise pas l'opérateur @ pour passer l'adresse du TRect mais directement le TRect lui-même.

    Donc oui c'est cette dernière syntaxe à utiliser.

  12. #12
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Merci, je ferais attention dorénavant pour les autres fonctions/utilisations équivalentes.

  13. #13
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    Autrement apparemment il y a une solution avec GetMousepos (je cherchais autre chose):

    http://support.microsoft.com/kb/112649/fr

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Merci 1000 X
    Sunchaser : Un grand merci à toi, à ton interet ... et à ton bout de code
    Ca va etre vraiment utile !! A tous les autres, merci pour vos répnses et pour avoir fait vivre ce post durant quelques jours.

    A+

  15. #15
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Ca va etre vraiment utile !!
    Cool

    ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 14
    Dernier message: 17/09/2008, 11h19
  2. Comment récupérer les handles des fenêtres d'un processus ?
    Par pivil dans le forum API, COM et SDKs
    Réponses: 11
    Dernier message: 19/09/2007, 19h03
  3. Réponses: 3
    Dernier message: 26/07/2007, 18h28
  4. Réponses: 11
    Dernier message: 08/04/2005, 11h20

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