Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Invité de passage
    Inscrit en
    mars 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : mars 2011
    Messages : 3
    Points : 1
    Points
    1

    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 :
    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 :
     if Msg.wParam and MK_XBUTTON1 <>0 then
    ne fonctionne pas.

    Quelqu'un pourrait-il m'aider?

    Merci d'avance

  2. #2
    Expert Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 035
    Points : 12 851
    Points
    12 851

    Par défaut

    Essaye ceci

    Code :
    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 :
    1
    2
    3
    4
    5
    const
     MK_XBUTTON1 = $20;
     MK_XBUTTON2 = $40;
     XBUTTON1 = $00010000   
     XBUTTON2 = $00020000;
    Code :
    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

    Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !

  3. #3
    Invité de passage
    Inscrit en
    mars 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : mars 2011
    Messages : 3
    Points : 1
    Points
    1

    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 :
    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 Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 035
    Points : 12 851
    Points
    12 851

    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 :
    procedure TForm2.WMXButtonDown(var Msg: TMsg);
    par
    Code :
    procedure TForm2.WMXButtonDown(var Msg: TMessage);
    avec un TMessage, tu dois pouvoir utiliser wParam correctement !

    Code :
    1
    2
    3
    4
    5
    TMessage = record
        Msg: Cardinal;
        WParam: WPARAM;
        LParam: LPARAM;
        Result: LRESULT
    Code :
    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

    Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !

  5. #5
    Invité de passage
    Inscrit en
    mars 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : mars 2011
    Messages : 3
    Points : 1
    Points
    1

    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 :
    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 :
    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 Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro Paul TOTH
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 510
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul TOTH
    Âge : 45
    Localisation : Réunion

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 510
    Points : 14 526
    Points
    14 526

    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
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •