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 :

[Windows] Intercepter les messages d'un handle


Sujet :

Windows

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut [Windows] Intercepter les messages d'un handle
    Bonjour à tous,

    Je possède un moteur graphique en temps réel. On lui donne un handle de contrôle Windows, et après il dessine dedans.

    Le soucis c'est que je l'utilise pour une application de gestion, donc plutôt statique, et que le dessin n'a pas forcément besoin d'être redessiné tout le temps.

    Alors, dans mes objets graphiques, lors de la phase "d'update", ça renvoie un booléen indiquant si derrière une mise à jour du rendu doit être fait.

    Mais selon les évènements envoyés au handle, le rendu doit être effectué même si les objets graphiques n'ont pas bougé. Par exemple lors d'un resize du contrôle ou d'un évènement style onShow.

    Mais comment intercepter ces évènements lié au handle afin de forcer l'affichage au bon moment ?

    Je pense qu'il me faut un truc du style SubclassWindow mais je n'utilise pas les MFC..

    Comment puis-je m'y prendre ?

    Merci,
    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    Bonjour,

    Je n'ai que peu de connaissances dans ce domaine, mais j'ai peut-être une piste.

    Pour forcer le rafraichissement de ma fenêtre, et donc l'émission d'un message WM_PAINT dans le CALLBACK de mon application Win32, j'utilisait les fonctions suivantes:

    InvalidateRect (hnd, NULL, TRUE);
    UpdateWindow (hnd);

    avec hnd ton HWND.

  3. #3
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Le SubclassWindow des MFC ne fait que peu de chose. Il peut être émulé complètement en utilisant SetWindowLongPtr(GWLP_WNDPROC, pfun), ou pfun est une nouvelle fonction de gestion des fenêtres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void subclass_window(HWND hwnd, WNDPROC newproc, WNDPROC* oldproc)
    {
       oldproc = (WNDPROC)(GetWindowLongPtr(hwnd, GWLP_WNDPROC);
       SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)newproc);
    }
    newproc doit, à un moment où à un autre, appeler oldproc afin de traiter les messages qui ne sont pas traités par newproc.

    Il est possible de changer la DLGPROC d'une dialog box de manière similaire. On peut aussi changer la WNDPROC d'une classe de fenêtre avec SetClassLongPtr()
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Merci pour cette réponse.

    En fait, l'application utilisatrice est faite en QT.

    J'ai essayé comme tu m'as dit :
    oldproc = (WNDPROC)(GetWindowLongPtr(hwnd, GWLP_WNDPROC);
    SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)newproc);
    Et j'ai constaté deux choses :
    - Dans newproc, je ne reçois que ces évènements :
    132 - WM_NCHITTEST
    32 - WM_SETCURSOR
    512 - WM_MOUSEFIRST
    Alors j'ai tenté de passer par le parent :
    oldproc = (WNDPROC)(GetWindowLongPtr(GetParent(hwnd), GWLP_WNDPROC);
    SetWindowLongPtr(GetParent(hwnd), GWLP_WNDPROC, (LONG_PTR)newproc);
    Et là j'avais les messages qui m'intéressaient.. bizarre
    - Dans newproc, si je ne peux pas gérer un message, j'utilise "DefWindowProc" et ça passe correctement, mais c'est pas super je pense. Par contre en utilisant oldproc, quelques messages passent, puis arrivé au 799 (31F), ça plante. J'ai cherché sur le net, je n'ai pas trouvé la signification de ce message.. peut-être est-ce quelque chose de spécifique à Qt ?

    Alors désormais je peux avancer mais bon, ces deux trucs me laisse un sentiment de bricolage dans mon installation.. Si quelqu'un pouvait m'éclairer ça serait sympa

    Merci encore,
    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Sous XP et supérieur, on utilise plutôt SetWindowSubclass().
    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.

Discussions similaires

  1. Intercepter les messages de windows
    Par Teyyeb dans le forum Débuter
    Réponses: 1
    Dernier message: 06/04/2008, 08h12
  2. Comment intercepter les messages d'un processus sous windows?
    Par Hamdi Hedhili dans le forum Général Java
    Réponses: 3
    Dernier message: 17/03/2008, 16h57
  3. Intercepter les messages windows
    Par schneed dans le forum C++Builder
    Réponses: 2
    Dernier message: 01/12/2005, 14h12
  4. [Indy] Intercepter les messages coté client
    Par PpPool dans le forum Web & réseau
    Réponses: 6
    Dernier message: 04/07/2005, 10h19
  5. Réponses: 2
    Dernier message: 06/04/2004, 08h39

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