C# 如何禁用alt+;应用程序的F4?

C# 如何禁用alt+;应用程序的F4?,c#,.net,winforms,C#,.net,Winforms,如何在C#应用程序范围内禁用ALT+F4应用程序 在我的应用程序中,我有许多WinForms,我想禁用使用ALT+F4关闭表单的功能。不过,用户应该能够使用表单的“X”来关闭表单 同样,这不仅仅是一种形式。我正在寻找一种方法,使ALT+F4是整个应用程序禁用,将不会为任何形式的工作。有可能吗?您可以在主启动方法中添加如下内容: namespace WindowsFormsApplication1 { static class Program { /// <s

如何在C#应用程序范围内禁用ALT+F4应用程序

在我的应用程序中,我有许多WinForms,我想禁用使用ALT+F4关闭表单的功能。不过,用户应该能够使用表单的“X”来关闭表单


同样,这不仅仅是一种形式。我正在寻找一种方法,使ALT+F4是整个应用程序禁用,将不会为任何形式的工作。有可能吗?

您可以在主启动方法中添加如下内容:

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.AddMessageFilter(new AltF4Filter()); // Add a message filter
            Application.Run(new Form1());
        }
    }

    public class AltF4Filter : IMessageFilter
    {
        public bool PreFilterMessage(ref Message m)
        {
            const int WM_SYSKEYDOWN = 0x0104;
            if (m.Msg == WM_SYSKEYDOWN)
            {
                bool alt = ((int)m.LParam & 0x20000000) != 0;
                if (alt && (m.WParam == new IntPtr((int)Keys.F4)))
                return true; // eat it!                
            }
            return false;
        }
    }
}
命名空间窗口窗体应用程序1
{
静态类程序
{
/// 
///应用程序的主要入口点。
/// 
[状态线程]
静态void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.AddMessageFilter(新的AltF4Filter());//添加消息筛选器
Application.Run(新Form1());
}
}
公共类AltF4Filter:IMessageFilter
{
公共bool预过滤器消息(参考消息m)
{
常量int WM_SYSKEYDOWN=0x0104;
if(m.Msg==WM\u SYSKEYDOWN)
{
bool alt=((int)m.LParam&0x20000000)!=0;
if(alt&&(m.WParam==newintptr((int)key.F4)))
return true;//吃掉它!
}
返回false;
}
}
}

您应该问自己一个问题-为什么要删除这种关闭对话框的标准方式?你正在打破惯例,这样做需要一个很好的理由-查看用户体验堆栈交换。哇,可能的副本与回答者完全相同,然后突然将其删除。背阴的哇,然后将其编辑为:
,我建议您执行以下操作:
,@Daniel请停止复制和粘贴他人的答案,同时获取学分。把这个问题标记为重复问题,然后用你的时间去做更好的事情。@john:如果你不得不一次又一次地用每种形式写代码,那就不会是全局性的。可以创建包含该功能的
表单
基类,或者枚举
应用程序.OpenForms
集合并动态附加此行为。无论如何,我相信全球解决方案值得一个自己的答案,即使它是基于上面链接的现有答案。问题的关键是如何在所有
表单中重复使用链接答案中提供的代码,而这些答案中没有回答。@john:代码中最重要的部分是你不知道如何编写的部分,至少对于提问者来说是这样。请尊重他们的问题。这是一个有趣的解决方案。如果消息处理延迟(由于延迟)并且
Control.ModifierKeys
不再报告
Ctrl
被按下(错过),该怎么办?谢谢您的解决方案。我在找这样的东西。与alt+F4一起,它还过滤掉alt+shift+F4。只是想让你知道。@AllonGuralnek-Hmm。。。我发现我们有一个挑剔的听众:-)我已经更新了我的答案,使用LPRAM的第29位而不是Control.ModifierKeys.Hello@SimonMourier我如何才能禁用CTRL-ALT-DEL、ALT-TAB和开始菜单谢谢。@DreamerXD-问另一个问题