- 2016-10-9
- Visual C#
業務システム作ってると、ちょくちょくFromの[×]ボタンを、
無効化する事が多い。
備忘。
無効化
[×]ボタンの無効化(見えるけど押せない)は、
API呼び出しでできる。
【無効化前】
上記の画面から、下記の流れで処理すると無効化できる。
1.システムメニュー(フォームの)ハンドル取得する。
2.[×]ボタンを無効化する。
ソース
// ----------------------------------------------------- using System.Runtime.InteropServices; // 今回の処理に必要 // -----------------------------------------------------
上記、using して、
// ----------------------------------------------------- // APIを呼び出すため、対象のDLLをインポート [DllImport("USER32.DLL")] private static extern IntPtr GetSystemMenu(IntPtr hWnd, UInt32 bRevert); [DllImport("USER32.DLL")] private static extern UInt32 RemoveMenu(IntPtr hMenu, UInt32 nPosition, UInt32 wFlags); // 定数定義 private const UInt32 SC_CLOSE = 0x0000F060; private const UInt32 MF_BYCOMMAND = 0x00000000; // -----------------------------------------------------
API使えるようにして、定数宣言。
// ----------------------------------------------------- // コントロールボックスの[閉じる]ボタンの無効化 IntPtr hMenu = GetSystemMenu( this.Handle, 0 ); // システムメニュー(フォームの)ハンドル取得する RemoveMenu( hMenu, SC_CLOSE, MF_BYCOMMAND ); // [×]ボタンを無効化する。 // -----------------------------------------------------
コンストラクタで実行する。
下記、ソース全部
using System; using System.Windows.Forms; // DLLインポートするのに必要 using System.Runtime.InteropServices; // 今回の処理に必要 namespace FormExitSample { public partial class Form1 : Form { // APIを呼び出すため、対象のDLLをインポート [DllImport("USER32.DLL")] private static extern IntPtr GetSystemMenu(IntPtr hWnd, UInt32 bRevert); [DllImport("USER32.DLL")] private static extern UInt32 RemoveMenu(IntPtr hMenu, UInt32 nPosition, UInt32 wFlags); // 定数定義 private const UInt32 SC_CLOSE = 0x0000F060; private const UInt32 MF_BYCOMMAND = 0x00000000; public Form1() { InitializeComponent(); // コントロールボックスの[閉じる]ボタンの無効化 IntPtr hMenu = GetSystemMenu( this.Handle, 0 ); // システムメニュー(フォームの)ハンドル取得する RemoveMenu( hMenu, SC_CLOSE, MF_BYCOMMAND ); // [×]ボタンを無効化する。 } private void Form1_Load(object sender, EventArgs e) { this.Text = "[×]ボタンの無効化"; } } }
上記を実行すると、こんな感じになる。
(若干、見辛いか?)
以前にVCの記事で書いたC#版なんだけども、
他にやり方ありそうだけどね。
VC++ ダイアログの[×]ボタンを無効化(グレーアウト)する