C#,WinForms:什么会阻止KeyDown事件从聚焦控制链接到主窗体?只有叶子控件KeyDown适合我

时间:2010-05-14 23:40:47

标签: c# winforms keyboard-events keydown

据我所知,当按下键盘按钮时,它应调用具有焦点的控件的KeyDown事件。然后,父控件的KeyDown,依此类推,直到它到达主窗体。除非 - 其中一个EventHandler做了:

e.SuppressKeyPress = true;
e.Handled = true;

在我的情况下,KeyDown事件永远不会到达主窗体。 我有表格 - >面板 - >按钮例如。

Panel不提供KeyDown事件,但它不应该阻止它到达主窗体吗?

现在作为一种解决方法我将每个控件设置为调用我写的事件处理程序。我基本上试图阻止Alt-F4关闭应用程序,而是将其最小化。

3 个答案:

答案 0 :(得分:2)

[编辑]

如果您想要捕获Alt-F4,那么在控制级别尝试是没有意义,因为应用程序会处理该击键 - 请参阅How to Disable Alt + F4 closing form?

答案 1 :(得分:2)

您可以使用应用程序消息过滤器:

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            Application.AddMessageFilter(new TestMessageFilter());
            Application.Run(new Form1());
        }
    }

    public class TestMessageFilter : IMessageFilter
    {
        private int WM_SYSKEYDOWN = 0x0104;
        private int F4 = 0x73;

        public bool PreFilterMessage(ref Message i_Message)
        {
            Console.WriteLine("Msg: {0} LParam: {1} WParam: {2}", i_Message.Msg, i_Message.LParam, i_Message.WParam);
            if (i_Message.Msg == WM_SYSKEYDOWN && i_Message.WParam == (IntPtr)F4)
                return (true); // Filter the message
            return (false);
        } // PreFilterMessage()

    } // class TestMessageFilter
}

答案 2 :(得分:0)

尝试创建一个观察者来捕捉你的事件:

http://ondotnet.com/pub/a/dotnet/2002/04/15/events.html