Trapper la combinaison CONTROL + SHIFT + F

Résolu
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 - 3 oct. 2005 à 18:02
Arthenius Messages postés 1182 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..."

9 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
3 oct. 2005 à 22:31
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;
}
}
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
3 oct. 2005 à 22:51
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#
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
5 oct. 2005 à 16:15
J'ai testé sur une forme avec plusieurs contrôles ça marche. Tu as bien fait this.KeyPreview = true ?
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
3 oct. 2005 à 23:02
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#
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
4 oct. 2005 à 08:49
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..."
0
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
5 oct. 2005 à 15:30
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..."
0
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
5 oct. 2005 à 16:45
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..."
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
8 oct. 2005 à 12:59
C'est rien va, je t'avais dit de ne pas mettre de CR dans cette appli là

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
10 oct. 2005 à 08:35
lol


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

"Ce qui ne me tue pas, me rend plus fort..."
0
Rejoignez-nous