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

Signaler
Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
-
Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
-
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..."

9 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
32
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;
}
}
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
82
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#
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
32
J'ai testé sur une forme avec plusieurs contrôles ça marche. Tu as bien fait this.KeyPreview = true ?
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
82
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#
Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
12
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..."
Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
12
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..."
Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
12
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..."
Messages postés
6352
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
82
C'est rien va, je t'avais dit de ne pas mettre de CR dans cette appli là

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
1183
Date d'inscription
mercredi 21 janvier 2004
Statut
Membre
Dernière intervention
6 septembre 2011
12
lol


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

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