3

据我了解,当按下键盘按钮时,它应该为具有焦点的控件调用 KeyDown 事件。然后,父控件的 KeyDown,依此类推,直到它到达主窗体。除非 - 沿着链条之一的 EventHandlers 做了:

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

就我而言,KeyDown 事件永远不会到达主窗体。例如,我有表单-> 面板-> 按钮。

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

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

4

3 回答 3

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
}
于 2010-05-15T02:55:48.120 回答
2

[编辑]

如果您想捕获 Alt-F4,那么在控制级别尝试没有意义,因为该击键由应用程序处理 - 请参阅 如何禁用 Alt + F4 关闭表单?

于 2010-05-14T23:44:25.883 回答
0

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

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

于 2010-05-15T00:17:13.760 回答