C#捕获主窗体键盘事件

如何捕获WinForm主窗体的键盘事件,其他控件是。 所以我想要捕获一个事件Ctrl + S并且无关紧要。 但是没有Pinvoke(钩子等……)只有.NET管理内部电源。

试试这个代码。 使用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; } } } 

我测试了这个,并为我工作。

Form类(System.Windows.Forms)具有OnKeyDown , OnKeyPress和OnKeyUp事件方法,可用于检测Ctrl + S

在这些方法中使用KeyEventArgs来确定按下了哪些键

编辑

一定要启用Form.KeyPreview = true; 因此,无论焦点如何,表单都将捕获事件。

处理表单及其所有控件上的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"); } } } 

您可以添加一个MenuStrip,然后创建一个名为save的菜单条项目,并给它一个快捷键Ctrl + S.为此添加一个事件处理程序。 即使焦点在表单上的其他控件上,这也会触发。 如果你不喜欢看MenuStrip; 你也可以设置visible = false。 我必须承认这很难看。