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 :

Utiliser les boutons étendus de la souris


Sujet :

Delphi

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Utiliser les boutons étendus de la souris
    Bonjour,

    Je cherche à utiliser les boutons étendus de ma souris (déclenchant les "précédent/suivant" dans un navigateur internet).

    Après une recherche sur ce forum j'ai vu que je devais traiter le message windows
    J'ai donc créé une appli toute bête permettant de faire mes tests

    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
     
     type
      TForm2 = class(TForm)
      private
        { Déclarations privées }
        procedure WMXButtonDown(var Msg: TMsg); message WM_XBUTTONDOWN;
      public
        { Déclarations publiques }
      end;
     
    const
     MK_XBUTTON1 = $20;
     MK_XBUTTON2 = $40;
     
    var
      Form2: TForm2;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm2.WMXButtonDown(var Msg: TMsg);
    var
     i : integer;
    begin
     if Msg.wParam and MK_XBUTTON1 <>0 then
         begin
         Showmessage('Bouton étendu 1');
         Exit;
         end;
     if Msg.wParam and MK_XBUTTON2 <>0 then
         begin
         Showmessage('Bouton étendu 2');
         Exit;
         end;
    end;
    Mon problème : je n'arrive pas à différencier les 2 boutons étendus. Le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if Msg.wParam and MK_XBUTTON1 <>0 then
    ne fonctionne pas.

    Quelqu'un pourrait-il m'aider?

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 844
    Points
    24 844
    Par défaut
    Essaye ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm2.WMXButtonDown(var Msg: TMsg);
    begin
     ShowMessage(IntToStr(Msg.wParam));
    end;
    Est-ce que wParam change de valeur en fonction du bouton appuyé ?

    Si oui essaye ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const
     MK_XBUTTON1 = $20;
     MK_XBUTTON2 = $40;
     XBUTTON1 = $00010000   
     XBUTTON2 = $00020000;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm2.WMXButtonDown(var Msg: TMsg);
    begin
     if (Msg.wParam and XBUTTON1) <> 0 then
         Showmessage('Bouton étendu 1 clické');
     else if (Msg.wParam and XBUTTON2) <> 0 then
         Showmessage('Bouton étendu 2 clické');
     else if (Msg.wParam and MK_XBUTTON1) <> 0 then
         Showmessage('Bouton étendu 1 appuyé');
     else if (Msg.wParam and MK_XBUTTON2) <> 0 then
         Showmessage('Bouton étendu 2 appuyé');
    end;
    Je ne suis pas un expert en ce qui concerne les priorités des opérateurs, je préfère mettre mes () pour être sur que le code fonctionne comme je l'ai prévu !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Candidat au Club
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse

    La variable wParam change en fonction de la position du curseur sur la fiche mais pas en fonction du bouton de la souris. Cela m'a induit en erreur

    Du coup j'ai regardé quel composante du TMsg variait et j'ai testé ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     if Msg.Message and MK_XBUTTON1 <>0 then
         begin
         Showmessage('Bouton étendu 1');
         Exit;
         end;
     if Msg.Message and MK_XBUTTON2 <>0 then
         begin
         Showmessage('Bouton étendu 2');
         Exit;
         end;
    Ce test marche!

    La variable à contrôler était donc
    Merci pour tes indications!

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 844
    Points
    24 844
    Par défaut
    wParam contient le masque du bouton
    lParam contient la position de souris
    Tu as un décalage mémoire suite à une confusion de type

    TMsg c'est le type Windows, interne aux API
    TMessage c'est le type simplifié Delphi, pour la VCL

    change
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure TForm2.WMXButtonDown(var Msg: TMsg);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure TForm2.WMXButtonDown(var Msg: TMessage);
    avec un TMessage, tu dois pouvoir utiliser wParam correctement !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TMessage = record
        Msg: Cardinal;
        WParam: WPARAM;
        LParam: LPARAM;
        Result: LRESULT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TMsg = record
        hwnd: HWND; 
        message: UINT;
        wParam: WPARAM;
        lParam: LPARAM;
        time: DWORD;
        pt: TPoint;
      end;
    donc si tu reçois un TMessage et que tu l'utilises comme un TMsg, dans TMsg.message cela contient TMessage.WParam et dans TMsg.wParam cela contient TMessage.LParam, si tu accèdes à TMsg.time c'est même le risque d'une Violation d'Accès
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Candidat au Club
    Inscrit en
    Mars 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour la précision. J'ai remplacé TMsg par TMessage et cela fonctionne

    Comment cela se passe-t-il lorsqu'on gère les évenement via un handler?

    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
    45
    46
    47
     
    unit Unit2;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
     
    type
      TForm2 = class(TForm)
        procedure FormShow(Sender: TObject);
      private
        { Déclarations privées }
        procedure MsgHandler(var Msg: TMsg; var Handled: Boolean);
      public
        { Déclarations publiques }
      end;
     
    const
     MK_XBUTTON1 = $20;
     MK_XBUTTON2 = $40;
     
    var
      Form2: TForm2;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm2.FormShow(Sender: TObject);
    begin
     Application.OnMessage := MsgHandler;
    end;
     
    procedure TForm2.MsgHandler(var Msg: TMsg; var Handled: Boolean);
    begin
     if handled then exit;
     if Msg.Message = WM_XBUTTONDOWN then
         begin
         if (Msg.wParam and MK_XBUTTON2 <>0) then Showmessage('Bouton étendu 2')
         else
             if (Msg.wParam and MK_XBUTTON1 <>0) then Showmessage('Bouton étendu 1');
         handled:=true;
         exit;
         end;
    end;
    Est ce que déclarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.OnMessage := MsgHandler;
    est suffisamment propre?

    Dans ce cas la procédure MsgHandler ne peut contenir qu'une variable du type TMsg.

    Ce code semble fonctionner.

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    le message handler est utilisé quand on ne peut pas déterminer à l'avance le numéro de message, car il est paramétrable ou qu'il provient de RegisterWindowMessage; si on connait son numéro il est plus simple de passage par "message XXX"
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. Comment utiliser les boutons radio?
    Par mamelouk dans le forum Word
    Réponses: 5
    Dernier message: 18/06/2010, 11h34
  2. [XML]Comment utiliser les caractère étendus
    Par leminipouce dans le forum Langage
    Réponses: 2
    Dernier message: 31/10/2008, 14h59
  3. recherche code pour limiter une lister et utiliser les bouton suivant precedent
    Par carmen256 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/09/2006, 17h43
  4. Utiliser les méthodes des boutons crées en rafale.
    Par kabouns dans le forum Composants
    Réponses: 8
    Dernier message: 03/12/2004, 10h48
  5. Réponses: 11
    Dernier message: 22/12/2003, 21h06

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