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

C++ Discussion :

Récupérer le handle de contrôles qui ne sont pas atteignables par la souris (VB/C++)


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 82
    Par défaut Récupérer le handle de contrôles qui ne sont pas atteignables par la souris (VB/C++)
    Bonjour,

    Cette discussion est aussi placée en VB6 mais il me semble que le codage des API est une des forces des pros du C++.

    Un logiciel possède une fenêtre de classe #32770 (Dialog Box, très courant, une sorte de formulaire) qui contient des contrôles identifiés par leur ControlID.
    Il s'agit d'écrire le code pour récupérer le handle de ces contrôles.

    Mais ces contrôles ne sont pas atteignables par la souris tant qu'on n'a pas
    cliqué sur un bouton "Modifier" mis à disposition par le logiciel.
    Et du coup la fonction WindowFromPoint(x,y) que j'utilise sur l'évènement
    mouvement de la souris renvoie le handle de la fenêtre #32770 même quand je survole un des contrôles à l'intérieur de la fenêtre Dialog Box : elle ne les "atteind" pas.

    Pourtant, avec le Finder de l'onglet "Window Search" de Spy++, je peux les
    atteindre et Spy++ donne bien leur Handle.

    Quelqu'un sait-il comment faire ?

    Merci beaucoup d'avance.

    Quelqu'un connait-il la solution ? Quelles fonctions API pourrais-je
    utiliser ?

    Merci d'avance.

  2. #2
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    voir du coté de FindWindow
    mais ton post devrais plutot etre dans Prog. Windows

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    Voir plutot ChildWindowFromPoint.

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 82
    Par défaut ChildWindowFromPoint
    En effet je pensais pouvoir y arriver par ChildWindowFromPoint ou par RealChildWindowFromPoint.
    Mais ces deux APIs sont difficiles à utiliser : j'obtiens toujours un bug de dépassement de capacité.
    Il y a d'ailleurs un ancien article de Microsoft (http://support.microsoft.com/kb/463252/fr) sur un bug en VB 3 !!!

    En tout état de cause, si quelqu'un avait réalisé un bout de code qui marche avec une de ces fonctions, je serais preneur.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Euh...
    Comment ces fonctions peuvent-elles renvoyer un dépassement de capacité ?

    Il n'y a pas de tableau ni même de pointeur là-dedans!
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 82
    Par défaut Dépassement de capacité
    Bonjour Médinoc et merci de t'intéresser à ce problème.

    Comme ta question me laisse sans réponse, je te joins un bout de code (désolé c'est du VB6) qui provoque ce plantage.

    Il y faut un Form contenant un contrôle Picture1, deux boutons Command1 et Command2 et un timer à intervalle 500.

    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
     
    Declare Function WindowFromPoint Lib "User32" (ByVal y As Integer, ByVal x As Integer) As Integer
    Declare Function ChildWindowFromPointYX Lib "User32" Alias "ChildWindowFromPoint" _
    (ByVal hWnd As Integer, ByVal y As Integer, ByVal x As Integer) As Integer
    Declare Function RealChildWindowFromPoint Lib "User32" (ByVal hWnd As Integer, lpPoint As POINTAPI)
    Type POINTAPI
    x As Integer
    y As Integer
    End Type
    Declare Sub GetCursorPos Lib "User32" (lpPoint As POINTAPI)
    Declare Sub screentoclient Lib "User" (ByVal hWnd As Integer, lpPoint As POINTAPI)
     
    Sub Timer1_Timer()
    Dim coord As POINTAPI
    Dim Res As Integer
    Call GetCursorPos(coord)
    Call screentoclient(Picture1.hWnd, coord)
    Res = ChildWindowFromPointYX(Picture1.hWnd, coord.y, coord.x)
    Select Case Res
    Case Picture1.hWnd:
    Debug.Print "sur picture1"
    Case Command1.hWnd:
    Debug.Print "sur commandD1"
    Case Command2.hWnd:
    Debug.Print "sur commandD2"
    Case Else:
    Debug.Print "en dehors de picture1"
    End Select
     
    End Sub
    En espérant que ça t'aide pour ton interrogation....

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je pense qu'il y a un problème au niveau des déclarations:
    RealChildWindowFromPoint() semble prendre sa structure POINT par valeur (oui, ça me surprend aussi) et tu l'as laissée par référence (enfin, il me semble bien que c'est pas référence quand on ne met rien). De plus, tu ne lui as pas mis de type de retour...

    Pareil pour les fonctions WindowFromPoint() et ChildWindowFromPoint() (et je ne trouve pas de ChildWindowFromPointXY() nulle part dans la doc).

    Par contre, les fonctions ScreenToClient() et GetCursorPos(), de user32.dll, prennent toutes les deux leur POINT par référence.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 82
    Par défaut Finalement
    Bon, en final , j'ai abandonné les méthodes ChildWindowFromPoint et RealChildWindowFromPoint pour EnumChildWindow, en comparant le rectangle de chaque enfant de la #32770 avec la position du curseur et ça marche plutôt bien.

    Donc je considére ce post comme résolu, bien que la réponse sur ChildWindowFromPoint ne soit pas trouvée...

    NB : en effet Médinoc, il y a un binz autour de ByVal, ce qui apparaît me semble-t-il dans un article MSDN sur le sujet...

  9. #9
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Par défaut
    bonjour à tous,

    faisant une recherche je suis tombé sur ce post et bien qu'il date, il peut être intéressant pour d'autre d'y trouver des éléments de réponse:
    olaf_le_preux ton code ressemble étrangement à celui ci
    j'ai eu ce dépassement de mémoire aussi que j'ai résolu en redéclarant les hWnd en Long.
    et je conseil cette article qui est assez complet.
    sinon le code ici

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

Discussions similaires

  1. [RegEx] Transformer les liens qui ne sont pas précédé par "
    Par Khleo dans le forum Langage
    Réponses: 0
    Dernier message: 19/12/2012, 18h30
  2. Réponses: 2
    Dernier message: 18/02/2012, 17h56
  3. Récupérer le handle de contrôles qui ne sont pas atteignables par la souris
    Par olaf_le_preux dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 14/01/2008, 10h08
  4. Réponses: 4
    Dernier message: 11/07/2006, 21h43
  5. UNION ? des lignes qui ne sont pas prises...
    Par fred23195 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/12/2005, 14h50

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