C# 윈폼에서 닫기 X 버튼 비활성화/활성화 방법

작업공간/C#/Winform/WPF 2011.03.24 12:25

몇몇 작업을 하다 보면 사용자가 닫기 버튼을 사용하는 것을 막아야 할때가 있습니다. 예로, 한창 백그라운드 작업 중인데, 닫기 버튼을 클릭 해버리면 낭패죠. C# 기본 컨트롤 들이야 컨트롤명.Enabled = false; 식으로 간단하게 비활성화가 가능하지만 윈도우의 기본 닫기 X 버튼을 비활성화 하기에는 약간의 추가 작업이 필요합니다.

using System.Runtime.InteropServices;

private const int SC_CLOSE = 0xF060;
private const int MF_ENABLED = 0x0;
private const int MF_GRAYED = 0x1;
private const int MF_DISABLED = 0x2;

[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("user32.dll")]
private static extern int EnableMenuItem(IntPtr hMenu, int wIDEnableItem, int wEnable);

public Form1()
{
    InitializeComponent();
    EnableMenuItem(GetSystemMenu(this.Handle, false), SC_CLOSE, MF_GRAYED);
}


저작자 표시 비영리 동일 조건 변경 허락
신고

설정

트랙백

댓글

  • 지나가다 2012.03.28 16:09 신고 ADDR 수정/삭제 답글

    이거 동작 않습디다.

  • 지나가다2 2012.05.08 16:11 신고 ADDR 수정/삭제 답글

    생성자에 EnableMenuItem() 메소드를 넣으니 처음 호출할 화면에서만 비활성화 되고, 폼을 최대화 하거나 최소화 후 폼을 보이게 하면 닫기 버튼이 활성화 되는 군요. Paint 이벤트 핸들러에 EnableMenuItem 메소드를 넣으면 어떨까 싶네요.

    • BlogIcon 친절한티스 2012.05.08 21:17 신고 수정/삭제

      그렇네요. 최대화, 최소화 시에 다시 복구 되는 문제가 있네욤. 말씀 하신대로 Paint 이벤트 핸들러나 최대/최소화 시에 재적용을 해주는 쪽이 좋겠네요.


티스토리 툴바