有时候你会看到一些窗体,它们的标题栏上的关闭按钮被禁用了。如果程序处于某种关键进程中,你可不希望用户随意中断它,这时就可以考虑将关闭按钮禁用。.NET Framework对此没有内置的支持,不过借助于Win32 API, 可以轻松搞定。
1、新建一个Windows应用程序,新建一个窗体,进入代码视图。
2、添加必要的命名空间:
using System.Runtime.InteropServices;
3、添加必要的常数和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);
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);
4、在窗体的Load事件处理函数内添加代码:
IntPtr hMenu = GetSystemMenu(this.Handle, 0);
EnableMenuItem(hMenu, SC_CLOSE, MF_DISABLED | MF_GRAYED);
EnableMenuItem(hMenu, SC_CLOSE, MF_DISABLED | MF_GRAYED);
下面是效果图:
那么如果该关键进程结束,需要使该按钮可用怎么办?
使用下面的代码就可以了:
IntPtr hMenu = GetSystemMenu(this.Handle, 0);
EnableMenuItem(hMenu, SC_CLOSE, MF_ENABLED);
EnableMenuItem(hMenu, SC_CLOSE, MF_ENABLED);
在http://ryanfarley.com/blog/archive/2004/04/12/526.aspx中介绍了另一种做法,也可以参考一下。