我有一个Windows窗体应用程序,其表单包含2个tabcontrols和一个网格。我想在这个控件上抓住esc键的按键。 问题是:如果没有在每个控件上订阅按键事件,这是一种更简单的方法吗?
谢谢!
答案 0 :(得分:2)
你可以简单地跟随。
实现IMessageFilter
和Handle Key Down事件。
以下是将Escape Key Down挂钩的完整代码。
public class MyKeboardHook:IMessageFilter
{
public const int WM_KEYDOWN = 0x0100;
public const int VK_ESCAPE = 0x1B;
public event EventHandler EscapeKeyDown;
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == WM_KEYDOWN && m.WParam == new IntPtr(VK_ESCAPE))
{
OnEscapeKeyPressed();
}
return false; //Do not Process anything
}
protected virtual void OnEscapeKeyDown()
{
if(this.EscapeKeyDown!=null)
{
EscapeKeyDown(this, EventArgs.Empty);
}
}
}
现在你需要注册这个。最好的地方是在Main
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MyKeboardHook myKeboardHook = new MyKeboardHook();
myKeboardHook.EscapeKeyDown += (e, x) =>
{
MessageBox.Show("Escape Key Pressed");
};
Application.AddMessageFilter(myKeboardHook);
Application.Run(new Form1());
}
}
答案 1 :(得分:0)
在表单上订阅活动。
如果控件没有处理事件,它应该冒泡到将要处理它的表单。