【发布时间】:2014-04-28 22:31:03
【问题描述】:
如何捕捉 WinForm 主窗体的键盘事件,其他控件在哪里。 所以我想捕捉一个事件 Ctrl + S 并且焦点在哪里并不重要。 但没有 Pinvoke(钩子等......) 只有 .NET 管理内部电源。
【问题讨论】:
如何捕捉 WinForm 主窗体的键盘事件,其他控件在哪里。 所以我想捕捉一个事件 Ctrl + S 并且焦点在哪里并不重要。 但没有 Pinvoke(钩子等......) 只有 .NET 管理内部电源。
【问题讨论】:
试试这个代码。使用接口IMessageFilter可以过滤任意ctrl+key。
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 Class (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");
}
}
}
【讨论】:
doesn't matter where focus is 指的是表单或其控件内部,所以无论焦点在哪里,例如 textBox1 或表格。不是你的意思吗?
您可以添加一个 MenuStrip,然后创建一个名为 save 的菜单条项目,并给它一个快捷键 Ctrl + S。为此添加一个事件处理程序。即使焦点在表单上的其他控件上,它也会触发。如果您不喜欢看到 MenuStrip;你也可以设置 visible = false 。我必须承认这很丑。
【讨论】: