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         }
在窗体的Load事件中调用上面声明的函数

  

  然后、禁用的效果我们就基本完成了、运行看看吧、、、

  这时、你会发现一个问题:虽然不能点击关闭按钮了、但是当我们按下Alt+F4的时候、依然可以关闭、、、这是什么情况?!

  这是因为、我们只改变了它的样式、并没有改变他的功能、、、怎么办?

  这时、我们可以添加一个窗体的FormClosing事件:

1         private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
2         {
3             e.Cancel = true;//告诉程序、已经执行了这个功能了、不用继续了、相当于是欺骗吧、、、
4         }
添加的FormClosing事件、为了实现禁止关闭的功能

  然后、这个禁用关闭的功能就实现了、、、为了一会退出、给自己留一个后路吧、、、

  也就是我们在窗体上添加的那个用来退出的按钮、双击按钮添加点击事件、添加退出的方法:

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 尊重原创、】

 

 

 

 

posted @ 2013-05-21 18:33  单曲循环ㄋ  阅读(1584)  评论(0编辑  收藏  举报