ProcessCmdKey – 等待KeyUp?

我在WinForms应用程序中遇到以下问题。 我正在尝试实现热键,我需要在控件处于活动状态时处理Key消息,无论焦点是否在该控件内的文本框上,等等。

重写ProcessCmdKey可以很好地为此工作,并且完全符合我的要求,但有一个例外:

如果用户按下某个键并按住它,ProcessCmdKey将继续触发WM_KEYDOWN事件。

但是,我想要实现的是用户必须在另一个热键动作触发之前再次释放按钮(因此,如果有人坐在键盘上,它不会导致连续的热键事件)。
但是,我找不到捕获WM_KEYUP事件的位置,所以我可以设置一个标志,如果它应该再次处理ProcessCmdKey消息?

有人可以帮到这里吗?

谢谢,

汤姆

我觉得这很简单,只要看看钥匙的重复次数。 如果使用修饰符,则无效。 您还需要看到密钥上升,这需要实现IMessageFilter。 这工作:

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); }