Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > Débutant
Débutant Pour bien débuter avec Delphi
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/01/2013, 10h27   #1
xxDamDamxx
Invité de passage
 
Inscription : 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
xxDamDamxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 11h57   #2
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 195
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

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

Informations forums :
Inscription : juillet 2006
Messages : 9 195
Points : 13 245
Points : 13 245
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é !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 13h45   #3
xxDamDamxx
Invité de passage
 
Inscription : mars 2011
Messages : 3
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 3
Points : 1
Points : 1
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!
xxDamDamxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 14h05   #4
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 195
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

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

Informations forums :
Inscription : juillet 2006
Messages : 9 195
Points : 13 245
Points : 13 245
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é !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 09/01/2013, 14h58   #5
xxDamDamxx
Invité de passage
 
Inscription : mars 2011
Messages : 3
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 3
Points : 1
Points : 1
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.
xxDamDamxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 15h57   #6
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 419
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 419
Points : 10 806
Points : 10 806
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%
Paul TOTH est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h09.


 
 
 
 
Partenaires

Hébergement Web