Windows에서는이 작업을 수행 할 수있는 방법을 제공합니다. 시스템 메뉴를 사용하여 문제를 해결할 수 있습니다. 멋진 피드백을 제공하기 때문에 닫기 버튼이 실제로 비활성화 된 것처럼 보일 것입니다. 시스템 메뉴에서 SC_CLOSE 명령을 비활성화 할 수 있습니다. 샘플 양식으로 가장 잘 보여 주면 버튼을 눌러 시작하십시오.
using System.Runtime.InteropServices;
...
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
button1.Click += new EventHandler(button1_Click);
}
private bool mCloseEnabled = true;
public bool CloseEnabled {
get { return mCloseEnabled; }
set {
if (value == mCloseEnabled) return;
mCloseEnabled = value;
setSystemMenu();
}
}
protected override void OnHandleCreated(EventArgs e) {
base.OnHandleCreated(e);
setSystemMenu();
}
private void setSystemMenu() {
IntPtr menu = GetSystemMenu(this.Handle, false);
EnableMenuItem(menu, SC_CLOSE, mCloseEnabled ? 0 : 1);
}
private const int SC_CLOSE = 0xf060;
[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool revert);
[DllImport("user32.dll")]
private static extern int EnableMenuItem(IntPtr hMenu, int IDEnableItem, int wEnable);
private void button1_Click(object sender, EventArgs e) {
CloseEnabled = !CloseEnabled;
}
}
양식을 하위 클래스로 작성하고 닫을 코드를 작성한 다음 하위 폼에 대신 사용할 수 있습니다. –
@Michael. 어려움은 레거시 응용 프로그램이며 많은 Forms가 이미 구현되어 있습니다. 계승 된 클래스를 변경하는 것은 그렇게 어렵지 않습니다. 문제는 그 클래스들 각각이'Closing' 이벤트에 핸들러를 가지고 있다는 것입니다. 상속 된 클래스에서 호출 된 다른 사용자 지정 이벤트에 바인딩 할 수 있습니다. 나는 여전히 더 나은 해결책을 원하지만 그것이 지금까지 얻은 최선이다. –