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

Delphi Discussion :

Envoyer un message à un menu depuis un hook


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut Envoyer un message à un menu depuis un hook
    Bonjour,

    Cela faisait longtemps que je n'avais pas fait de Delphi et je m'y suis remis sur la version XE4.
    Je regarde comment fonctionne les styles en utilisant cette librairie assez connu : https://github.com/RRUZ/vcl-styles-utils
    Le problème est qu'il y a encore quelques bugs au niveau des popupmenu et du menu système.

    J'ai résolu presque tous les problèmes. Le popup menu est entièrement redessiné, il n'y a pas de flickering, le scrolling du popupmenu fonctionne également.
    Tout cela fonctionne avec un hook.

    Mais il reste encore un problème. Quand on clic sur un élément, Windows envoie dans la file de message l'ID du menu qui a été activé.
    Et comme le menu a été redessiné et peut avoir subi un scrolling, les éléments de dessins ne sont pas la où Windows les voit. Ce qui fait qu'il lance le mauvais menu.

    J'arrive à intercepter le message pour ne pas l'envoyer au popupmenu, à récupérer le HMenu du menu, ainsi que l'ID réel en fonction de la position du clic de souris.
    Donc presque tout fonctionne sauf que je n'arrive pas à envoyer le message au popupmenu.

    En regardant le fichier Vcl.Menus.pas, je pense que c'est le TPopupList qui attend le message WM_COMMAND avec l'ID du menu dans wParam pour exécuter le clic. Pour le TVclStylesSystemMenu c'est un WM_SYSCOMMAND qu'il attend.

    J'ai essayé la commande suivante. Je pense qu'il ne fonctionne pas car le handle n'est pas le bon.
    Je ne sais pas comment récupérer le handle permettant d'envoyé le message au popupmenu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SendMessage(handle, WM_COMMAND, Items[FKeyIndex].ID, 0);
    J'ai également essayé de modifier directement le message que je reçois dans le hook mais visiblement, mes modifications ne sont pas prises en compte pour le message envoyé au TPopupList
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Message.WParam := FKeyIndex;
    Le hook est fait sur le '#32768' et les récepteurs de message que j'ai identifié semblent être TPopupList (popupmenu) et TVclStylesSystemMenu (menu système).

    Est-ce bien à cause du handle que le message n'est pas reçu ?
    Si je ne laisse pas passer le message, les récepteurs ne le reçoivent pas mais quand je le modifie, ils ne récupèrent pas la modification.
    Comment faire pour envoyer le message aux récepteurs ?
    Et enfin, comment pour déterminer le type de récepteur ?

    Je mettrais le code final sur Github quand il fonctionnera.

    Merci d'avance pour votre aide.

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Comme j'ai pu avancé et que la question est maintenant différente, je fais un nouveau post.

    Finalement, j'ai trouvé comment faire ce que je cherchais. Il suffisait de regarder comment les autres actions étaient traitées pour trouver la réponse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Message.Result := CallDefaultProc(Message);
    Mais cela ne suffit pas car le fonctionnement n'est que partiel.
    En effet, le message semble envoyé correctement uniquement si la zone ou l'utilisateur clic est une zone commune entre la zone que Windows connait du popupitem et la nouvelle zone dessinée.
    Sinon, cela provoque le dessin de l'item anciennement sélectionné par Windows et celui qui a été indiqué par le code précédent.
    Donc au lieu de cliquer, c'est un changement de sélection qui est lancé.
    Donc, dans le cas ou le scrolling a été utilisé, rien ne fonctionne puisqu'il n'y a plus de zone commune.

    Voici un exemple ou un scrolling a été fait et c'est la valeur 4 qui a été sélectionnée.
    Nom : exemple20170630.png
Affichages : 219
Taille : 18,3 Ko

    Avez-vous une idée ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    A force de chercher, on trouve.
    Une solution est d'envoyer les messages suivants dans l'ordre pour simuler la sélection de l'item et l'action de l'item le touche avec des messages.
    - sélection de l'item
    - appuie sur la touche entrée
    - relâchement de la touche entrée

    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
    Message2.Msg := MN_SELECTITEM;
    Message2.wParam := FKeyIndex;
    Message2.lParam := 0;
    Message2.Result := 0;
    Message2.Result := CallDefaultProc(Message2);
     
    Message2.Msg := WM_KEYDOWN;
    Message2.wParam := VK_RETURN;
    Message2.lParam := 0;
    Message2.Result := 0;
    Message2.Result := CallDefaultProc(Message2);
     
    Message2.Msg := WM_KEYUP;
    Message2.wParam := VK_RETURN;
    Message2.lParam := 0;
    Message2.Result := 0;
    Message2.Result := CallDefaultProc(Message2);
     
    //Message.Result := CallDefaultProc(Message); //plus nécessaire d'envoyer l'appuie sur un item
    exit;
    Bonne soirée.

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

Discussions similaires

  1. Envoyer un message depuis un batch
    Par pmithrandir dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 05/11/2008, 14h47
  2. Emetteurs n'ayant pas envoyé de message depuis plus d'1 an
    Par emccbo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/08/2007, 14h36
  3. Réponses: 4
    Dernier message: 28/03/2005, 19h42
  4. [ServerSocket] Envoyer un message vers un client
    Par Michel_57 dans le forum Web & réseau
    Réponses: 4
    Dernier message: 06/08/2004, 23h01
  5. Envoyer un message icmp (Echo Request)
    Par ovdz dans le forum Développement
    Réponses: 5
    Dernier message: 19/06/2003, 14h14

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