Alt + F4 닫기 양식을 비활성화하는 방법은 무엇입니까?


79

사용자가 양식을 닫지 못하도록 ac # win 양식에서 Alt+ 를 비활성화하는 가장 좋은 방법은 무엇입니까 F4?

진행률 표시 줄을 표시하는 팝업 대화 상자로 양식을 사용하고 있으며 사용자가 닫을 수 없도록하고 싶습니다.


FormClosing 이벤트 핸들러 내에서 [Alt] + [F4]를 눌렀는지 확인하기 위해 키보드 버퍼 (이에 대한 액세스 권한이 있습니까?)를 검색 할 수없고, 참이면 취소하고, 그렇지 않으면 계속할 수 있습니까?
TK.

답변:


107

이것은 일을합니다 :

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = true;
}

편집 : pix0rs 문제에 대한 응답으로-예, 프로그램 적으로 앱을 닫을 수 없다는 것이 맞습니다. 그러나 양식을 닫기 전에 form_closing 이벤트에 대한 이벤트 핸들러를 간단히 제거 할 수 있습니다.

this.FormClosing -= new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
this.Close();

4
대부분의 사람들이 문제의 양식 (Form1)에서이 방법을 구현하고 있다고 생각합니다. 이 경우 대리자를 연결하지 않고 대신 OnFormClosing 메서드를 재정의하는 것이 좋습니다. "OnFormClosing 메서드를 사용하면 파생 클래스도 대리자를 연결하지 않고도 이벤트를 처리 할 수 ​​있습니다. 이것은 파생 클래스에서 이벤트를 처리하는 데 선호되는 기술입니다." tinyurl.com/3dzzljq
antsyawn

10
이벤트 핸들러를 다음과 같이 만들었습니다 e.Cancel = (e.Reason == CloseReason.UserClosing);.. 이렇게하면 USER가 양식을 닫으려고 할 때만 닫히지 않습니다.
Paulo Santos

이 접근 방식에는 한 가지 큰 문제가 있습니다. PC를 종료 / 다시 시작하려면 해당 요청도 취소됩니다 (적어도 Windows XP에서는)
conceptacid 2014

그것은 훌륭합니다! 특히 양식을 닫고 싶을 때 이벤트를 제거하는 것을 좋아합니다. 너무 간단 해요 !!!

@Will : 대답을 편집했습니다. 이제 이벤트 처리기를 제거하지 않고 작동하는 솔루션이 있습니다.
Thomas Weller

59

당신이 보면 FormClosingEventArgs e.CloseReason양식을 폐쇄하는 이유, 그것은 당신을 말할 것이다. 그런 다음 수행 할 작업을 결정할 수 있으며 가능한 값은 다음과 같습니다.

회원 이름 -설명


없음 -폐쇄 원인이 정의되지 않았거나 확인할 수 없습니다.

WindowsShutDown- 운영 체제가 종료하기 전에 모든 응용 프로그램을 닫습니다.

MdiFormClosing- 이 MDI (다중 문서 인터페이스) 양식의 상위 양식이 닫힙니다 .

UserClosing- 사용자가 사용자 인터페이스 (UI)를 통해 양식을 닫고 있습니다. 예를 들어 양식 창에서 닫기 단추를 클릭하거나 창의 제어 메뉴에서 닫기를 선택하거나 ALT+를 누릅니다 F4.

TaskManagerClosing -Microsoft Windows 작업 관리자가 응용 프로그램을 닫고 있습니다.

FormOwnerClosing- 소유자 양식이 닫힙니다 .

ApplicationExitCall -Application 클래스의 Exit 메서드가 호출되었습니다.


8
그들이 UserClosing을 좀 더 세분화하여 특별히 Alt + F4를 대상으로 할 수
있다면

if (e.CloseReason == CloseReason.UserClosing) {e.Cancel = true; }
adnan2nd

결합 CloseReasonDialogResult최상의 결과를 위해.
Thomas Weller

25

나는 이것이 올바른 방법이라고 믿습니다.

protected override void OnFormClosing(FormClosingEventArgs e)
{
  switch (e.CloseReason)
  {
    case CloseReason.UserClosing:
      e.Cancel = true;
      break;
  }

  base.OnFormClosing(e);
}

휴식을 반환으로 대체하는 것이 좋습니다
Bahadır Yağan 2011

실제로 올바른 패턴은 취소 플래그를 true로 설정 한 다음 기본 클래스를 호출하는 것입니다. On [Event] 메서드를 재정의 할 때 모든 이벤트 구독자에게도 이벤트를 알릴 수 있도록 기본 클래스를 호출하는 것이 중요합니다. 예,이 경우 이벤트를 취소 했으므로 다른 사람이 이에 대해 알 필요가 없다고 생각하기 쉽지만 그 가정을하는 것이 옳다고 생각하지 않습니다.
antsyawn 2011

이유는 확실하지 않지만 기본 클래스를 호출하면 후속 Alt + F4를 누른 후 응용 프로그램이 충돌합니다. 처음에는 평범한 F4가 내 응용 프로그램에서 다른 의미를 가지고 있기 때문이라고 생각했지만 긴 디버깅 세션은 그렇지 않았습니다. 어쨌든, 그것은 여전히 ​​내 편에서 특정한 경우 일 수 있습니다. 이 훌륭한 답변에 감사드립니다.
Bahadır Yağan 2011

기본 클래스를 호출하면 이후 Alt + F4에서 내 앱이 중단됩니다. 기본 클래스가 e.Cancel을 확인하지 않고 어쨌든 양식을 파괴하려고 시도합니다.
Natan Yellin

애플리케이션이 충돌하는 이유를 조사해야합니다. 다른 곳에서 뭔가 잘못하고있을 가능성이 있습니다. 문서에 "FormClosing 이벤트는 양식이 닫힐 때 발생합니다. 양식이 닫히면 해당 양식이 폐기되어 양식과 관련된 모든 리소스가 해제됩니다.이 이벤트를 취소하면 양식이 열린 상태로 유지됩니다. 양식 닫기를 취소하려면 폼에서 이벤트 처리기에 전달 된 FormClosingEventArgs의 Cancel 속성을 true로 설정합니다. " tinyurl.com/3tb7y9q
antsyawn

16

응용 프로그램이 자체적으로 닫히지 않도록하는 것은 잘못된 형식으로 간주됩니다. Closing 이벤트에 대한 이벤트 인수를 확인하여 응용 프로그램을 닫도록 요청한 방법과 이유를 확인해야합니다. Windows 종료로 인한 경우 닫기가 발생하지 않도록 방지해서는 안됩니다.


13

FormClosing이벤트를 처리 하고로 설정할 FormClosingEventArgs.Canceltrue있습니다.


12

진행률 표시 줄을 표시하는 팝업 대화 상자로 양식을 사용하고 있으며 사용자가 닫을 수 없도록하고 싶습니다.

사용자가 alt + f4를 누를만큼 충분히 지식이있는 앱을 종료하기로 결정했다면 작업 관리자를 실행하고 대신 애플리케이션을 종료 할 수있을만큼 충분히 지식이있을 것입니다.

적어도 alt + f4를 사용하면 앱이 단순히 앱을 죽이는 것이 아니라 정상적으로 종료 할 수 있습니다. 경험상 사람들이 앱을 죽이는 것은 손상된 구성 파일, 손상된 데이터베이스, 재개 할 수없는 반쯤 완료된 작업 및 기타 많은 고통스러운 일을 의미합니다.

적어도 그것을 막기보다는 '확실합니까'라고 프롬프트하십시오.


8

이것은 Alt+ 를 비활성화하는 해킹 F4입니다.

private void test_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this.ModifierKeys == Keys.Alt || this.ModifierKeys == Keys.F4) 
    { 
        e.Cancel = true; 
    }    
}

이것이 작동하는지 확인할 수 있습니다. 그러나를 사용 System.Windows.Forms하는 경우 Control.ModifierKeys속성 대신 정적 속성 을 확인해야 this.ModifierKeys합니다 (위의 스 니펫 참조).
Special Sauce

이 방법은 CloseReason.UserClosing 이유를 공유하는 Close () 메서드를 사용하여 응용 프로그램을 닫을 수 있기 때문에 더 좋습니다. 이 접근 방식에 대한 나의 관심은 현재 눌러 진 키 정보가 항상 정확하다는 것입니다.
Adam LS

4

FormClosing 이벤트 구독

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = e.CloseReason == CloseReason.UserClosing;
}

메서드 본문에 한 줄만 있습니다.


3

이것은 일을합니다 :

bool myButtonWasClicked = false;
private void Exit_Click(object sender, EventArgs e)
{
  myButtonWasClicked = true;
  Application.Exit();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
  if (myButtonWasClicked)
  {
    e.Cancel = false;
  }
  else
  {
    e.Cancel = true;
  }


}

2

프로그래밍 방식으로 창을 닫을 때에도 FormClosing이 호출됩니까? 그렇다면 작업을 항상 취소하는 대신 작업을 마쳤을 때 양식을 닫을 수 있도록 일부 코드를 추가 할 수 있습니다.


귀하의 질문에 대한 대답은 "예"입니다. 추가 질문을 답변으로 게시하지 마십시오. 이미 정말 훌륭하고 투표가 많고 받아 들여진 답변이 있습니다. 괜찮 으시면 삭제 해주시 겠어요? 실제로 가치를 추가하지 않습니다. 삭제를 보상하기 위해 귀하의 답변 중 3 개를 찬성했습니다.
Thomas Weller

-3

양식 생성자에서 다음을 사용하여 양식에서 닫기 단추를 숨 깁니다.

this.ControlBox = false;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.