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

Windows Discussion :

Encadrer un composant Windows comme Spy++


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Par défaut Encadrer un composant Windows comme Spy++
    Bonjour,

    J'ai créé un petit utilitaire qui permet (entre autres choses) de mettre en surbrillance le composant Windows sous le curseur de la souris, comme le fait Spy++ ou HyperCam2.

    Globalement, ça fonctionne.

    Mais il reste quelques petits problèmes mineurs.
    • de temps en temps, le cadre que je dessine est écrasé en partie ou en totalité par le composant sous-jacent. Je dessine directement sur le hDC du composant. Ce n'est peut-être pas la bonne méthode.
    • de temps en temps, le cadre de l'ancien composant sélectionné n'est pas effacé. J'utilise pourtant la fonction RedrawWindow().
    • j'aimerais pouvoir changer le curseur de la souris de manière globale pour montrer qu'on est en mode "sélection". J'ai essayé d'appeler SetCursor() après SetCapture(), ou pendant un MouseHook, mais ça ne marche pas. Mais je ne pense pas que cela soit possible vu que le curseur de la souris est une ressource partagée...


    Avez-vous des idées pour améliorer ces quelques points ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 521
    Par défaut
    Avez-vous lu cet article :
    http://www.codeproject.com/KB/dialog/windowfinder.aspx

    Je ne l'ai pas testé mais il y a les sources.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Par défaut
    Merci beaucoup.

    Ça a l'air très intéressant. Je vais lire tout ça à tête reposée...

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Sans avoir visité le lien, je pense que spy++ dessine bien son cadre dans le HDC de la fenêtre concernée, mais le dessine en XOR. Cela lui permet d'enlever le cadre sans faire de RedrawWindow...
    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.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Par défaut
    Merci pour toutes vos réponses.

    Le programme sur codeproject, ainsi que Spy++, utilisent tous deux la capture de la souris. Cela a deux avantages : pouvoir changer le curseur de la souris de manière globale, et empêcher les composants sélectionnés de se redessiner au passage de la souris (info-bulles, boutons changeant d'apparence)...

    Le problème est que je n'ai pas accès à cette capture vu que mon utilitaire n'a pas d'interface graphique. Il est résident dans la barre de notifications. Je ne pourrais donc pas contourner ces problèmes, même si je dessine en mode XOR. Si le contrôle se redessine avant que je ne le fasse, c'est mort.

    J'ai donc décidé de procéder différemment.

    J'affiche une fenêtre TopMost sans bordure ni titre qui couvre la totalité de l'écran. J'affiche sur son fond une capture d'écran que j'ai faite juste avant. Cela me permet ainsi de contrôler l'aspect du curseur de la souris ainsi que tout ce qui est relatif au dessin.

    Le problème est que du coup WindowFromPoint ne marche plus. La fonction me renvoit à chaque fois le handle de ma fenêtre TopMost...

    J'essaye donc d'implémenter ma propre fonction WindowFromPoint qui ignorerait la fenêtre TopMost. J'utilise pour cela la fonction EnumWindows pour parcourir toutes les fenêtres principales (sauf la TopMost ), puis de là, je fais une recherche récursive avec ChildWindowFromPoint. Mais ça ne fonctionne pas comme je voudrais... La fonction EnumWindows ne liste pas les fenêtres dans l'ordre de profondeur (Z-Order)... Ce qui fait que j'encadre bien un composant sous le curseur de la souris, mais toujours un qui est masqué par une autre fenêtre.

    Donc, ma question est : y a-t-il un moyen de récupérer le Z-Order d'une fenêtre ? Ou alors de lister les fenêtres dans l'ordre ?

    PS : pour info, après avoir bidouillé pas mal avec, je pense que HyperCam2 fonctionne comme cela.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 521
    Par défaut
    Pourquoi n'as-tu pas accès à la capture de la souris ?

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    J'ai une idée: Puisque ta fenêtre contient exactement ce qui est derrière elle, qu'est-ce qui t'empêche de la cacher avec ShowWindow(SW_HIDE) pour faire le WindowFromPoint() ?

    Du moins, AVANT le premier surlignement ? ... Oh mince.

    Ou bien, pourquoi pas placer une fenêtre topmost transparente juste sur le contrôle à encadrer ?
    Tu n'auras qu'à faire un WindowFromPoint dès que la souris semble quitter ta fenêtre (TrackMouseEvent et cie)...
    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 à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Par défaut
    J'ai une idée: Puisque ta fenêtre contient exactement ce qui est derrière elle, qu'est-ce qui t'empêche de la cacher avec ShowWindow(SW_HIDE) pour faire le WindowFromPoint() ?

    Du moins, AVANT le premier surlignement ? ... Oh mince.
    Hmm, ça risque de clignoter une fois que j'aurais dessiné sur ma fenêtre. Mais je vais quand même essayer...

    Ou bien, pourquoi pas placer une fenêtre topmost transparente juste sur le contrôle à encadrer ?
    Tu n'auras qu'à faire un WindowFromPoint dès que la souris semble quitter ta fenêtre (TrackMouseEvent et cie)...
    Le problème est qu'un contrôle peut en contenir d'autres. Si je fais un WindowFromPoint dès que la souris quitte ma mini fenêtre TopMost, je raterai les composants enfants...

    Aujourd'hui, j'ai téléchargé plein d'utilitaires qui permettent de capturer un composant Windows. Ils procédent tous de la même manière : afficher une fenêtre TopMost qui contient tout l'écran, puis travailler là-dessus. Ils arrivent tous à le faire. Je ne pensais pas que ça allait être si difficile...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Par défaut
    J'ai bien une idée : appeler WindowFromPoint pour chaque pixel de l'écran avant d'afficher ma TopMost. J'enregistre tous les résultats dans une structure interne, et hop. Mais ça risque de prendre des plombes...
    J'ai procédé comme cela finalement. Ça marche...

Discussions similaires

  1. lire une vidéo dans un composant window
    Par dado225 dans le forum Flash
    Réponses: 2
    Dernier message: 01/09/2006, 09h33
  2. Réponses: 3
    Dernier message: 16/08/2006, 17h33
  3. Encadrer des composants
    Par sc_wizard29 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 01/04/2006, 16h57
  4. [FLASH MX2004] Composant window et jpg
    Par oceanbigone dans le forum Flash
    Réponses: 1
    Dernier message: 15/09/2005, 01h23
  5. [Kylix] les composants kylix... comme Delphi ???
    Par just1980 dans le forum EDI
    Réponses: 3
    Dernier message: 11/10/2004, 14h38

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