有時候你會看到一些表單,它們的標題列上的關閉按鈕被禁用了。如果程式處於某種關鍵進程中,你可不希望使用者隨意中斷它,這時就可以考慮將關閉按鈕禁用。.NET Framework對此沒有內建的支援,不過藉助於Win32 API, 可以輕鬆搞定。 我們要調用的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);
4、在表單的Load事件處理函數內添加代碼: IntPtr hMenu = GetSystemMenu(this.Handle, 0);
EnableMenuItem(hMenu, SC_CLOSE, MF_DISABLED | MF_GRAYED);
下面是:
那麼如果該關鍵進程結束,需要使該按鈕可用怎麼辦?
使用下面的代碼就可以了:
IntPtr hMenu = GetSystemMenu(this.Handle, 0);
EnableMenuItem(hMenu, SC_CLOSE, MF_ENABLED);
在http://ryanfarley.com/blog/archive/2004/04/12/526.aspx中介紹了另一種做法,也可以參考一下。