ProcessCmdKey – attendre KeyUp?

Je rencontre le problème suivant dans une application WinForms. J’essaie d’implémenter des raccourcis clavier et j’ai besoin de traiter les messages clés chaque fois que le contrôle est actif, que le focus soit sur une zone de texte au sein de ce contrôle, etc.

Remplacer ProcessCmdKey fonctionne parfaitement pour cela et fait exactement ce que je veux, à une exception près:

Si un utilisateur appuie sur une touche et la maintient enfoncée, ProcessCmdKey continue de déclencher des événements WM_KEYDOWN.

Cependant, ce que je veux réaliser est que l’utilisateur relâche le bouton avant qu’un autre raccourci clavier ne se déclenche (ainsi, si quelqu’un est assis sur le clavier, cela ne provoquera pas d’événements de raccourci clavier continus).
Cependant, je ne trouve pas où attraper les événements WM_KEYUP, je peux donc définir un indicateur s’il doit traiter à nouveau les messages ProcessCmdKey?

Quelqu’un peut aider ici?

Merci,

À M

Je pensais que ce serait facile, il suffit de regarder le nombre de répétitions de la clé. Cela n’a pas fonctionné si des modificateurs sont utilisés. Vous devez également voir la clé monter, ce qui nécessite la mise en œuvre d’IMessageFilter. Cela a fonctionné:

public partial class Form1 : Form, IMessageFilter { public Form1() { InitializeComponent(); Application.AddMessageFilter(this); this.FormClosed += (s, e) => Application.RemoveMessageFilter(this); } bool mRepeating; protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == (Keys.Control | Keys.F) && !mRepeating) { mRepeating = true; Console.WriteLine("What the Ctrl+F?"); return true; } return base.ProcessCmdKey(ref msg, keyData); } public bool PreFilterMessage(ref Message m) { if (m.Msg == 0x101) mRepeating = false; return false; } } 
 const int WM_KEYDOWN = 0x100; const int WM_KEYUP = 0x101; protected override bool ProcessKeyPreview(ref Message m) { if (m.Msg == WM_KEYDOWN && (Keys)m.WParam == Keys.NumPad6) { //Do something } else if (m.Msg == WM_KEYUP && (Keys)m.WParam == Keys.NumPad6) { //Do something } return base.ProcessKeyPreview(ref m); }