我在一个WinForms应用程序中遇到了以下问题。我正在尝试实现热键,当控件处于活动状态时,我需要处理按键消息,无论焦点是否在该控件中的文本框上,等等。
覆盖ProcessCmdKey对此非常有效,并且完全符合我的要求,但有一个例外:
如果用户按下某个键并保持按下,ProcessCmdKey会不断触发WM_KEYDOWN事件。
然而,我想要实现的是,用户必须再次释放按钮,才能触发另一个热键操作(因此,如果有人坐在键盘上,就不会导致连续的热键事件)。
但是,我找不到在哪里捕获WM_KEYUP事件,所以如果它应该再次处理ProcessCmdKey消息,我可以设置一个标志吗?
这里有人能帮上忙吗?
谢谢,
汤姆
发布于 2010-03-13 03:20:10
我想这很简单,只要看看键的重复次数就行了。如果使用修饰符,则不起作用。您还需要看到密钥上升,这需要实现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;
}
}发布于 2011-05-19 03:52:35
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);
}https://stackoverflow.com/questions/2434834
复制相似问题