按下表格

时间:2010-10-20 08:53:18

标签: windows forms keyboard

我有一个Windows窗体应用程序,其表单包含2个tabcontrols和一个网格。我想在这个控件上抓住esc键的按键。 问题是:如果没有在每个控件上订阅按键事件,这是一种更简单的方法吗?

谢谢!

2 个答案:

答案 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)

在表单上订阅活动。

如果控件没有处理事件,它应该冒泡到将要处理它的表单。