哈哈,主要是調用RemoveMenu這個API,所以沒什麼好說的,直接“干貨”吧:
namespace VersatileMessageBoxLib { using System; using System.Windows.Interop; using System.Runtime.InteropServices; public class CloseButton { [DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] private static extern int GetSystemMenu(int hwnd, int revert); [DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] private static extern int EnableMenuItem(int menu, int ideEnableItem, int enable); private const int SC_CLOSE = 0xF060; private const int MF_BYCOMMAND = 0x00000000; private const int MF_GRAYED = 0x00000001; private const int MF_ENABLED = 0x00000002; private CloseButton() { } public static void Disable(int handle) { // The return value specifies the previous state of the menu item // (it is either MF_ENABLED or MF_GRAYED). 0xFFFFFFFF indicates that // the menu item does not exist. switch (EnableMenuItem(GetSystemMenu(handle, 0), SC_CLOSE, MF_BYCOMMAND | MF_GRAYED)) { case MF_ENABLED: break; case MF_GRAYED: break; case -1: throw new Exception("The Close menu item does not exist."); default: break; } } }
在使用時:調用CloseButton.Disable(int handle)方法將窗口句柄傳進去就可以了,如果是WPF窗口的化,可以使用 int handle = new WindowInteropHelper(window).Handle.ToInt32(); 來取得句柄,WindowForms窗口的句柄是可以直接取得的。
另外,如果你想Cancel窗口的關閉而不是禁用該按鈕,那麼可以參考我的這篇文章:[WPF疑難]Hide me! not close