C#小程序:使用API禁用窗体关闭按钮
一直忙着找工作、一直没有发布什么文章、
今天给大家带来的是一个小功能:禁用窗体右上角的关闭按钮、
看到这里、也许你会说、这不是小儿科么、直接改动窗体的Form_Closing事件不就得了、、、
当然、这只是一种方法、我今天主要讲的是使用API+句柄禁用关闭按钮、而不是使用事件让按钮失效、、、
效果图(注意看右上角的关闭按钮):
好了、废话不多说、下面来一步一步的实现它、、、
首先、新建WinForm项目、添加窗体、命名随便、在这里我的命名是“frmMain.cs”、
如上图、添加一个按钮、命名为“btn_exit”、为了一会我们关不了窗体时退出用的、、、
然后按下F7、进入代码编辑界面、手动引入命名空间、用来使用API的:
using System.Runtime.InteropServices;
然后、声明常量(用来在下面的函数中充当参数 改变关闭按钮样式的)函数GetSystemMenu(用来获取指定句柄的窗体的标题栏)和EnableMenuItem(用来禁用标题栏中的关闭按钮):
1 /// <summary> 2 /// 设定样式用的常量 3 /// </summary> 4 private const int SC_CLOSE = 0xF060; 5 private const int MF_ENABLED = 0x00000000; 6 private const int MF_GRAYED = 0x00000001; 7 private const int MF_DISABLED = 0x00000002; 8 9 /// <summary> 10 /// 获取指定句柄的窗体的标题栏 11 /// </summary> 12 [DllImport("user32.dll", EntryPoint = "GetSystemMenu")] 13 private static extern IntPtr GetSystemMenu(IntPtr hWnd, int bRevert); 14 15 /// <summary> 16 /// 设置标题栏的关闭按钮的样式 17 /// </summary> 18 [DllImport("User32.dll")] 19 public static extern bool EnableMenuItem(IntPtr hMenu, int uIDEnableItem, int uEnable);
然后、我们在窗体启动的时候调用上面这两个函数就OK了、在窗体的构造函数或Load事件里面调用都可以、自己随意、、、在这里、我是在Form_Load事件中调用的:
1 private void frmMain_Load(object sender, EventArgs e) 2 { 3 IntPtr hMenu = GetSystemMenu(this.Handle, 0); 4 EnableMenuItem(hMenu, SC_CLOSE, (MF_DISABLED + MF_GRAYED) | MF_ENABLED); 5 }
然后、禁用的效果我们就基本完成了、运行看看吧、、、
这时、你会发现一个问题:虽然不能点击关闭按钮了、但是当我们按下Alt+F4的时候、依然可以关闭、、、这是什么情况?!
这是因为、我们只改变了它的样式、并没有改变他的功能、、、怎么办?
这时、我们可以添加一个窗体的FormClosing事件:
1 private void frmMain_FormClosing(object sender, FormClosingEventArgs e) 2 { 3 e.Cancel = true;//告诉程序、已经执行了这个功能了、不用继续了、相当于是欺骗吧、、、 4 }
然后、这个禁用关闭的功能就实现了、、、为了一会退出、给自己留一个后路吧、、、
也就是我们在窗体上添加的那个用来退出的按钮、双击按钮添加点击事件、添加退出的方法:
1 /// <summary> 2 /// 点击按钮结束当前应用程序的进程 3 /// </summary> 4 private void btn_exit_Click(object sender, EventArgs e) 5 { 6 Process.GetCurrentProcess().Kill(); 7 }
在这里注意:在这里使用Application.Exit()会没有反应、
所以我在这里用的是结束当前程序进程的方式、、、
然后、运行看看效果、有点意思吧、、、
不过、Bug依然存在:当我们改变窗体模式的时候(也就是切换最大化/正常化)、、你会发现、、关闭按钮、、、竟然可以点击了(虽然点击它无反应)、、、怎么办?
如果不用切换的话、就把最大化/正常化的按钮禁用掉、
如果你的程序需要这个按钮、那就在这个窗体切换状态的事件中再次调用那两个函数、重新禁用关闭按钮就OK了、、、
好了、这次的分享就到这里了、感谢您的支持、、、
【转载请注明 原文来自:http://www.cnblogs.com/HackerGuying 尊重原创、】