Trapper la combinaison CONTROL + SHIFT + F [Résolu]

Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
- - Dernière réponse : Arthenius
Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
- 10 oct. 2005 à 08:35
Salut a tous,



voila pour lancer une recherche avancee, je voudrais pouvoir trapper
sur une de mes form la combinaison de touche CONTROL + SHIFT + F


Pour cela j'utilise les IMessageFilter



voila mon code :





internal class CTRLSHIFTF_MessageFilter : IMessageFilter

{

// constructeur, on lui passe le form qui sera concerné par les actions

public CTRLSHIFTF_MessageFilter(Form form)

{

this.form = form;

}



[DllImport("user32")]

private static extern short GetAsyncKeyState(int vKey);

private const int WM_KEYDOWN = 0x0100;

private const int VK_CONTROL = 0x11;

private const byte VK_SHIFT = 0x10;

public const int VK_LSHIFT = 0xA0;

public const int VK_RSHIFT = 0xA1;

private Form form;



public bool PreFilterMessage(ref Message m)

{

// récupération de l'etat de la touche ctrl

short ctrlState = GetAsyncKeyState(VK_CONTROL);

short ShiftState = GetAsyncKeyState(VK_SHIFT);





// si le
message est une pression sur touche et que la touche est CTRl + F

if ( m.Msg == WM_KEYDOWN

&& m.WParam == (IntPtr)Keys.F // touche F


&& (( ctrlState >> 15 ) & 0x1) ==
0x1 // ctrl (gauche ou droit) est pressée


&& ( ShiftState <0) // Shift (gauche ou
droit) est pressée

)

{


// si le message est destiné a notre form ou un
controle qu'il contient, on le ferme


if ( m.HWnd == form.Handle ||
form.Contains(Control.FromHandle(m.HWnd)) == true )

{

w_FormBase f = (w_FormBase) form;

f.f_Recherche_Avancee();

// blocage du message

return true;

}

}

// le message n'etait pas celui qu'on attendais, on le laisse passer

return false;

}

}





seulement voila ca ne marche pas



pour info j'ai a peu pres le meme code qui me lance le CONTROL + F (qui est la simple recherche et qui marche bien)



je me susi inspirer de cela pour faire le CONTROL + SHIFT + F en rajoutant un test sur la touche shift...mais bon ...



donc si un petit coq passe par la..ou si quelqu'un d'autre a une solution je suis preneur



merci d'avance...

Arthenius
http://blogs.developpeur.org/Arthenius/

"Ce qui ne me tue pas, me rend plus fort..."
Afficher la suite 

9 réponses

Meilleure réponse
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29
3
Merci
Salut, je ne comprends pas pourquoi tu passes par IMessageFilter.tu peux attraper tout les events du clavier avec Form.KeyPreview.

protected override void OnKeyDown( KeyEventArgs e )
{
//base.OnKeyDown( e );


if ( e.Control && e.Shift && e.KeyCode == Keys.F )
{
MessageBox.Show( "Control + Shift + F" );
//e.Handled = true;
}
}

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 201 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Lutinore
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
3
Merci
Salut,

En fait ton code est tout à fait bon.
Tu as juste omis une chose : Ctrl+Maj+F contient la combinaisons Ctrl+F, que tu bloques avec ton premier MessageFilter si je ne m'abuse :-)

Donc soit tu testes comme ceci dans ton filtre pour la combinaison Ctrl+F :
if ( m.Msg == WM_KEYDOWN
&& m.WParam == (IntPtr)Keys.F // touche F
&& (( ctrlState >> 15 ) & 0x1) == 0x1 // ctrl (gauche ou droit) est pressée
&& !( ShiftState <0) // Shift (gauche ou droit) n'est pas pressée
)

Soit tu ajoutes l'instance du filtre pour Ctrl+Maj+F avant celui pour Ctrl+F, mais ça c'est moche :p

Cocoricoooooooo !!!!
coq
MVP Visual C#

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 201 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_coq
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29
3
Merci
J'ai testé sur une forme avec plusieurs contrôles ça marche. Tu as bien fait this.KeyPreview = true ?

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 201 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Lutinore
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
0
Merci
Pas bête ça, enfin avec le MessageFilter si il veut passer en mode de gestion pour l'application globale il lui suffira de modifier son test sur le Handle (pour faire ce que fait la boite de dialogue recherche de VS par exemple, quand on fait CTRL+H alors qu'on est dans la boite de recherche), alors qu'avec le KeyPreview il est limité au formulaire lui même.
Enfin si la cible sera de toutes façon un seul formulaire sans "switch de mode de recherche" c'est sur que ta solution est bien moins lourde je pense :-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
Commenter la réponse de cs_coq
Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
12
0
Merci
merci a vous deux...



bon je continue avec la solution de coq, (vu que c'est celle que j'ai implementer dans mon appli)

mais je garde ton autre solution pour des evenements ponctuel :)



en effet il fallait sur le CTRL + F Tester l'etat du shift...



bon je passerais aussi que j'ai oublier hier soir de rajouter les messagefilter a l'application



CTRL_SHIFT_F = new CTRLSHIFTF_MessageFilter(this);

Application.AddMessageFilter(CTRL_SHIFT_F);



et ne pas oublier a la fermeture de la form :

Application.RemoveMessageFilter(CTRL_SHIFT_F);



En fait ta solution lutinore fonctionnerait tres bien...vu que mes
combinaisons de touche ne se font que sur une form ...(celle dont
j'herite en fait dans toute mon appli)...mais bon tout refaire alors
que les messagefilter fonctionne aussi.........



:)


Arthenius
http://blogs.developpeur.org/Arthenius/

"Ce qui ne me tue pas, me rend plus fort..."
Commenter la réponse de Arthenius
Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
12
0
Merci
bon j'ai qd meme tester la méthode de lutinore, mais cela n'a pas marcher...

bon je suis fatigue aujourd'hui alors je ne vais pas chercher plus loin...

messagefilter reste mon ami


Arthenius
http://blogs.developpeur.org/Arthenius/

"Ce qui ne me tue pas, me rend plus fort..."
Commenter la réponse de Arthenius
Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
12
0
Merci
ok je sors

et je vais aller au lit


Arthenius
http://blogs.developpeur.org/Arthenius/

"Ce qui ne me tue pas, me rend plus fort..."
Commenter la réponse de Arthenius
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
75
0
Merci
C'est rien va, je t'avais dit de ne pas mettre de CR dans cette appli là

Cocoricoooooooo !!!!
coq
MVP Visual C#
Commenter la réponse de cs_coq
Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
12
0
Merci
lol


Arthenius
http://blogs.developpeur.org/Arthenius/

"Ce qui ne me tue pas, me rend plus fort..."
Commenter la réponse de Arthenius