如何捕获WinForm主窗体的键盘事件,其中包含其他控件。 因此,我想捕获一个事件 Ctrl + S ,无论焦点在哪里。 但是不使用Pinvoke(钩子等...) 只使用.NET托管内部功能。
Form类(System.Windows.Forms)拥有 OnKeyDown、OnKeyPress 和 OnKeyUp 事件方法,可用于检测按下了 Ctrl + S
在这些方法中使用KeyEventArgs来确定按下的键。
编辑
请确保启用 Form.KeyPreview = true;
,这样表单将捕获事件而不管焦点在哪里。
尝试使用以下代码。使用界面 IMessageFilter
,您可以过滤任何 ctrl+键。
public partial class Form1 :
Form,
IMessageFilter
{
public Form1()
{
InitializeComponent();
Application.AddMessageFilter(this);
this.FormClosed += new FormClosedEventHandler(this.Form1_FormClosed);
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
Application.RemoveMessageFilter(this);
}
public bool PreFilterMessage(ref Message m)
{
//here you can specify which key you need to filter
if (m.Msg == 0x0100 && (Keys)m.WParam.ToInt32() == Keys.S &&
ModifierKeys == Keys.Control)
{
return true;
}
else
{
return false;
}
}
}
我测试过了,对我起作用。
KeyDown
事件。private void OnFormLoad(object sender, EventArgs e)
{
this.KeyDown += OnKeyDown;
foreach (Control control in this.Controls)
{
control.KeyDown += OnKeyDown;
}
}
private void OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Control)
{
if (e.KeyValue == (int)Keys.S)
{
Console.WriteLine("ctrl + s");
}
}
}
textBox1
还是在表单中,都可以。这不是你的意思吗? - Jalal Said