Formの閉じるボタンを無効化するサンプルを掲載します。VB番は下記LiveSpaceのページに掲載しています。
確認環境
- Windows Vista Enterprise
- 開発環境:Visual Studio 2008 Professional
- .NET 3.5
.NETで開発していますが、実際にはpinvokeを使っています。GetSystemMenuメソッドで、メニューのハンドルを取得して、無効化しています。
プログラムの作成
フォームプロジェクトを作成して、フォームを次のように編集します。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace DisableMaxMenu { public partial class Form1 : Form { public Form1() { InitializeComponent(); } // pinvokeで列挙されている定数 // list from http://www.pinvoke.net/default.aspx/user32/EnableMenuItem.html internal const UInt32 MF_INSERT = 0x00000000; internal const UInt32 MF_CHANGE = 0x00000080; internal const UInt32 MF_APPEND = 0x00000100; internal const UInt32 MF_DELETE = 0x00000200; internal const UInt32 MF_REMOVE = 0x00001000; internal const UInt32 MF_BYCOMMAND = 0x00000000; internal const UInt32 MF_BYPOSITION = 0x00000400; internal const UInt32 MF_SEPARATOR = 0x00000800; internal const UInt32 MF_ENABLED = 0x00000000; internal const UInt32 MF_GRAYED = 0x00000001; internal const UInt32 MF_DISABLED = 0x00000002; internal const UInt32 MF_UNCHECKED = 0x00000000; internal const UInt32 MF_CHECKED = 0x00000008; internal const UInt32 MF_USECHECKBITMAPS = 0x00000200; internal const UInt32 MF_STRING = 0x00000000; internal const UInt32 MF_BITMAP = 0x00000004; internal const UInt32 MF_OWNERDRAW = 0x00000100; internal const UInt32 MF_POPUP = 0x00000010; internal const UInt32 MF_MENUBARBREAK = 0x00000020; internal const UInt32 MF_MENUBREAK = 0x00000040; internal const UInt32 MF_UNHILITE = 0x00000000; internal const UInt32 MF_HILITE = 0x00000080; internal const UInt32 MF_DEFAULT = 0x00001000; internal const UInt32 MF_SYSMENU = 0x00002000; internal const UInt32 MF_HELP = 0x00004000; internal const UInt32 MF_RIGHTJUSTIFY = 0x00004000; internal const UInt32 MF_MOUSESELECT = 0x00008000; internal const UInt32 MF_END = 0x00000080; /* Obsolete -- only used by old RES files */ internal const UInt32 MFT_STRING = MF_STRING; internal const UInt32 MFT_BITMAP = MF_BITMAP; internal const UInt32 MFT_MENUBARBREAK = MF_MENUBARBREAK; internal const UInt32 MFT_MENUBREAK = MF_MENUBREAK; internal const UInt32 MFT_OWNERDRAW = MF_OWNERDRAW; internal const UInt32 MFT_RADIOCHECK = 0x00000200; internal const UInt32 MFT_SEPARATOR = MF_SEPARATOR; internal const UInt32 MFT_RIGHTORDER = 0x00002000; internal const UInt32 MFT_RIGHTJUSTIFY = MF_RIGHTJUSTIFY; internal const UInt32 MFS_GRAYED = 0x00000003; internal const UInt32 MFS_DISABLED = MFS_GRAYED; internal const UInt32 MFS_CHECKED = MF_CHECKED; internal const UInt32 MFS_HILITE = MF_HILITE; internal const UInt32 MFS_ENABLED = MF_ENABLED; internal const UInt32 MFS_UNCHECKED = MF_UNCHECKED; internal const UInt32 MFS_UNHILITE = MF_UNHILITE; internal const UInt32 MFS_DEFAULT = MF_DEFAULT; internal const UInt32 SC_CLOSE = 0x0000F060; [DllImport("user32.dll")] static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable); [DllImport("user32.dll")] static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); [DllImport("user32.dll")] static extern int GetMenuItemCount(IntPtr hMenu); [DllImport("user32.dll")] static extern bool RemoveMenu(IntPtr hMenu, uint uPosition, uint uFlags); private void Form1_Load(object sender, EventArgs e) { //「X」閉じるメニュー無効化 IntPtr hMenu = GetSystemMenu(this.Handle, false); if (hMenu != IntPtr.Zero) { EnableMenuItem(hMenu, SC_CLOSE, MF_GRAYED); int menuItemCount = GetMenuItemCount(hMenu); RemoveMenu(hMenu, (uint)menuItemCount - 1, MF_REMOVE | MF_BYPOSITION); } } private void button1_Click(object sender, EventArgs e) { this.Close(); } } }
定数はpinvole.netに記載してあった内容をそのまま使っています。
間違い等がありましたら、ご指摘ください。
さんのコメント: さんのコメント: