1. Windows Forms中禁用窗体的关闭按钮 
添加必要的命名空间:
using System.Runtime.InteropServices;  
添加必要的常数和API函数的引用
private const int SC_CLOSE = 0xF060;
private const int MF_ENABLED = 0x00000000; private const int MF_GRAYED = 0x00000001; private const int MF_DISABLED = 0x00000002;  
[DllImport("user32.dll", EntryPoint = "GetSystemMenu")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, int bRevert); [DllImport("User32.dll")]
public static extern bool EnableMenuItem(IntPtr hMenu, int uIDEnableItem, int uEnable); 
在窗体的Load事件处理函数内添加代码
private void Form6_Load(object sender, EventArgs e) {
   IntPtr hMenu = GetSystemMenu(this.Handle, 0);
   EnableMenuItem(hMenu, SC_CLOSE, MF_DISABLED | MF_GRAYED); }  
2. Windows Forms中禁用窗体的关闭按钮和ALT+F4关闭

protected override CreateParams CreateParams {    get    {
      const int CS_NOCLOSE = 0x200;       CreateParams cp = base.CreateParams;       cp.ClassStyle = cp.ClassStyle | CS_NOCLOSE;       return cp;    } } 
3.不允许拖动窗体和最大化最小化按钮
        protected override void WndProc(ref Message m)         {
            base.WndProc(ref m);
            if (m.Msg == 0x84 && m.Result == (IntPtr)2) // 不让拖动标题栏             {
                m.Result = (IntPtr)1;             }
            if (m.Msg == 0xA3)                         // 双击标题栏无反应             {
                m.WParam = System.IntPtr.Zero;             }         }

///////////////////////////////////////////////////////////////////////////////////////////////////////// 钩子 
我用的是全局键盘钩子。这个程序可以屏蔽win和alt+f4但是不能屏蔽ctrl+alt+del。我一直在找屏蔽ctrl+alt+del的方法希望会的人指点一下。用了 form_load事件和Form1_FormClosing事件 using System;
using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text;
using System.Windows.Forms; using System.Runtime.InteropServices; using System.Reflection; 
namespace WindowsApplication10 {
    public partial class Form1 : Form     {
        // 安装钩子 
        [DllImport("user32.dll")]
        public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);         // 卸载钩子 
        [DllImport("user32.dll")]
        public static extern bool UnhookWindowsHookEx(int idHook);         // 继续下一个钩子          [DllImport("user32.dll")]
        public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam); 
        //声明定义
        public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);         static int hKeyboardHook = 0;         HookProc KeyboardHookProcedure; 
        public Form1()         {
            InitializeComponent();         }

private void Form1_Load(object sender, EventArgs e)         {
            HookStart();         } 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)         {
            HookStop();         } 
        // 安装钩子 
        public void HookStart()         {
            if (hKeyboardHook == 0)             {
                // 创建HookProc实例 
                KeyboardHookProcedure = new HookProc(KeyboardHookProc);                 //定义全局钩子
                hKeyboardHook = SetWindowsHookEx(13, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);                 if (hKeyboardHook == 0)                 {
                    HookStop();
                    throw new Exception("SetWindowsHookEx failed.");                 }             }         }
 
        //钩子子程就是钩子所要做的事情。
        private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)         {
            //这里可以添加别的功能的代码             return 1;         }
       
        // 卸载钩子 
        public void HookStop()         {
            bool retKeyboard = true;             if (hKeyboardHook != 0)             {

retKeyboard = UnhookWindowsHookEx(hKeyboardHook);                 hKeyboardHook = 0;             }
            if (!(retKeyboard)) throw new Exception("UnhookWindowsHookEx failed.");         }     }
}   
////////////////////////////////////////////////////////
//这个是仅仅屏掉alt f4
if(e.KeyCode == Keys.F4 && e.Modifiers==Keys.Alt)  { 
e.Handled=true;  } 
//这个是不让窗口以任何方式退出
  class   Test   :   System.Windows.Forms.Form      {   
      protected   override   void  
OnClosing(System.ComponentModel.CancelEventArgs   e)          {   
          e.Cancel   =   true;          }        
      static   void   Main()          {   
          System.Windows.Forms.Application.Run(new   Test());          }      }

C# 禁止ALT+F4(钩子)的更多相关文章

  1. C# Winform 实现屏蔽键盘的win和alt+F4的实现代码

    最近在做一个恶搞程序,就是打开后,程序获得桌面的截图然后,然后全屏显示在屏幕上,用户此时则不能进行任何操作. 此时希望用户不能通过键盘alt+F4来结束程序及通过Win的组合键对窗口进行操作.我在网上 ...

  2. wpf阻止键盘快捷键alt+space,alt+F4

    /// <summary>        /// 阻止 alt+f4和alt+space 按键        /// </summary>        /// <par ...

  3. C#屏蔽Alt+F4,解决Alt+F4关闭窗体时对话框NO后,线程不退出问题

    //1.将窗体的属性KeyPrieview设置为true //keypreview属性为true的时候,就可以响应键盘事件v //2.在窗体KeyDown事件中加如下代码 private void F ...

  4. Winfrom 屏蔽Alt+F4

    /// <summary> /// 屏蔽Alt+F4 /// </summary> /// <param name="m">要处理的 Windo ...

  5. wpf屏蔽快捷键alt+space,alt+F4

    /// <summary>        /// 阻止 alt+f4和alt+space 按键        /// </summary>        /// <par ...

  6. C#屏蔽Alt+F4组合键

    在开发的软件不希望用户关闭的情况下,或者我们不想用户回到桌面,这时候我们就需要屏蔽windows键,或者Alt + F4 键等. //1.将窗体的属性KeyPrieview设置为true //keyp ...

  7. Directx11教程(12) 禁止alt+enter全屏窗口

    原文:Directx11教程(12) 禁止alt+enter全屏窗口        在D3D11应用程序中,我们按下alt+enter键,会切换到全屏模式.有时候,我们在WM_SIZE中有一些代码,全 ...

  8. 如何在 pyqt 中捕获并处理 Alt+F4 快捷键

    前言 如果在 Windows 系统的任意一个窗口中按下 Alt+F4,默认行为是关闭窗口(或者最小化到托盘).对于使用了亚克力效果的窗口,使用 Alt+F4 最小化到托盘,再次弹出窗口的时候可能出现亚 ...

  9. WPF 屏蔽Alt+F4强制退出

    if (e.KeyStates == Keyboard.GetKeyStates(Key.F4) && Keyboard.Modifiers == ModifierKeys.Alt) ...

随机推荐

  1. 机器学习笔记-1 Linear Regression with Multiple Variables(week 2)

    1. Multiple Features note:X0 is equal to 1 2. Feature Scaling Idea: make sure features are on a simi ...

  2. 基于vue2.0前端组件库element中 el-form表单 自定义验证填坑

    eleme写的基于vue2.0的前端组件库: http://element.eleme.io 我在平时使用过程中,遇到的问题. 自定义表单验证出坑: 1: validate/resetFields 未 ...

  3. 自定义list排序

    使用扩展方法OrderBy,OrderByDescending,效果优良. 实现代码如下: private static void SortByExtensionMethod() { List< ...

  4. Java static 关键字详解

    引言 在<Java编程思想>中有这样一段话:static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建任何对象的前提下,仅仅通过类 ...

  5. Linux Centos 6.5_x86安装Nginx

    一.下载 二.编译安装 三.启动.停止.平滑重启 一.下载 地址:http://nginx.org/en/download.html 或者在linux上使用wget命令下载: wget http:// ...

  6. c#接口使用详解

    c#接口使用详解 c#中接口隐式与显示实现 c#中接口可以隐式实现.显示实现,隐式实现更常使用.显示实现较少使用 其区别在于 显示实现避免接口函数签名冲突 显示实现只可以以接口形式调用 显示实现其子类 ...

  7. 使用configuration配置结束在quartz.net中使用硬编码Job,Trigger任务提高灵活性

    经常在项目中遇到定时任务的时候,通常第一个想到的是Timer定时器,但是这玩意功能太弱鸡,实际上通常采用的是专业化的第三方调度框架,比如说 Quartz,它具有功能强大和应用的灵活性,我想使用过的人都 ...

  8. CentOS6.5下netcat工具安装教程

    1.下载下载地址:http://sourceforge.net/projects/netcat/files/netcat/0.7.1/下载的是netcat-0.7.1.tar.gz版本 2.拷贝用U盘 ...

  9. gitlab 添加SSH Key

    1.登录http://domain/users/sign_in 2.选择"Profile Settings",进入"Profile Settings"设置页面 ...

  10. java面向对象--包及访问控制符

    多人开发同一个项目时,会出现类名称相同的情况.package就是为了避免类或接口名称重复而采用的一种措施.实际上包就是有一定层次结构的文件夹,*.class文件要保存当前类声明的和包对应的文件夹中. ...