C #에서 Windows Forms 양식을 닫는 Esc 단추


92

나는 다음을 시도했다 :

private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    if ((Keys) e.KeyValue == Keys.Escape)
        this.Close();
}

하지만 작동하지 않습니다.

그런 다음 이것을 시도했습니다.

protected override void OnKeyDown(KeyEventArgs e)
{
    base.OnKeyDown(e);
    if (e.KeyCode == Keys.Escape)
        this.Close();
}

그리고 여전히 아무것도 작동하지 않습니다.

내 Windows Forms 양식 속성의 KeyPreview가 true로 설정되어 있습니다 ... 내가 뭘 잘못하고 있니?


1
이러한 방법에서 중단 점을 설정해 보셨습니까? 이벤트 핸들러가 실행 중입니까?
Steve Danner

1
양식 속성 'CancelButton'과 같이 취소 버튼의 이름을 지정하지 마십시오. 그렇지 않으면 CancelButton을 설정할 수없는 것 같습니다.
Jonas Middendorf

@SteveDanner, 이벤트가 트리거되지 않습니다. InitializeComponent ()의 선언이 누락되었을 수 있습니다.
InfantPro'Aravind '

나는 그것이 작동하지 않는 이유는 폼 안의 다른 컨트롤이 포커스를
받았기

답변:


199

이는 적절한 이벤트 핸들러 할당,, KeyPreview등과 관계없이 항상 작동합니다 CancelButton.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
    if (keyData == Keys.Escape) {
        this.Close();
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

10
-1, Form의 CancelButton 속성을 사용하는 것이 올바른 방법입니다.
ABCD

14
1980 년대에 전화해서 대화 상자를 되 찾길 원합니다.
Hans Passant 2013

1
true에서 돌아와 ProcessCmdKey키가 처리되었다는 신호를 보내서 "딩"소음을 방지 할 수도 있습니다 .
Spooky '

8
폼에 실제 Button (또는 IButtonControl 인터페이스 개체)이있는 경우에만 폼의 CancelButton 속성을 사용할 수 있습니다.
David

3
이 옵션은 좋습니다. CancelButton에는 양식에 추가로 보이는 '취소'버튼이 필요합니다. 이것은 중복 렌더링 + 코드 + etc
V319

64

양식의 CancelButton속성을 취소 버튼 으로 설정하면 코드가 필요하지 않습니다.


2
내가했지만 esc를 눌러도 실행되지 않습니다. 왜?
Mihai Bratulescu 2014 년

이것은 나를 위해 잘 작동했습니다. 작은 형태에 훨씬 좋습니다.
knut

15

"취소"단추가 있다고 가정하면 양식의 CancelButton속성 (디자이너 또는 코드)을 설정하면이 작업이 자동으로 처리됩니다. Click버튼 이 발생할 때 닫을 코드를 배치하기 만하면됩니다 .


9

받아 들여지는 대답은 실제로 정확하며 그 접근 방식을 여러 번 사용했습니다. 갑자기 더 이상 작동하지 않아서 이상하다는 것을 알았습니다. 대부분 내 중단 점이 ESC키에 대해 적중되지 않지만 다른 키에 대해 적중되기 때문입니다.

디버깅 후 내 양식의 컨트롤 중 하나 ProcessCmdKey가 다음 코드로 메서드 를 재정의한다는 것을 알았습니다 .

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    // ...
    if (keyData == (Keys.Escape))
    {
        Close();
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

... 그리고 이것은 내 양식이 ESC키 를 얻지 못하게 막았습니다 ( return true). 따라서 자녀 컨트롤이 귀하의 입력을 차지하지 않도록하십시오.


내 머리 위로, 해제하지 않도록 true로 설정 양식의 KeyPreview해야하는 경우 - msdn.microsoft.com/en-us/library/...
Andez

내 winform의 ListView 컨트롤 에서이 문제가 발생하는 것 같습니다. 문제가 발생한 곳이 ListView인지 궁금합니다.
raddevus

1

양식 옵션에서 KeyPreview를 true로 설정 한 다음 여기에 Keypress 이벤트를 추가합니다. 키 누르기 이벤트에서 다음을 입력합니다.

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 27)
    {
        Close();
    }
}

key.Char == 27 ASCII 코드의 이스케이프 값입니다.


이것은 문제에 대한 좋은 해결 방법입니다. ListView 컨트롤이있는 양식이 있는데이 경우 Esc를 누를 때 CancelButton을 삼키는 것 같습니다. 이 코드를 추가하여 문제를 해결했습니다.
raddevus

0

Escape 버튼은 Escape 키를 의미합니까? 귀하의 코드로 판단하면 그것이 귀하가 원하는 것이라고 생각합니다. Application.Exit ()를 시도 할 수도 있지만 닫기가 작동합니다. 작업자 스레드가 있습니까? 백그라운드가 아닌 스레드가 실행 중이면 응용 프로그램을 계속 열어 둘 수 있습니다.


0

이것을 이벤트 "KeyUp"에 추가해야합니다.

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if(e.KeyCode == Keys.Escape)
        {
            this.Close();
        }
    }

0

다른 양식을 트리거 할 수도 있습니다.

예를 들어 Form CancelButton 속성을 편집하고 Cancel 버튼을 설정하면 Cancel-Button이 트리거됩니다.

코드에서 취소 버튼을 다음과 같이 처리하여 양식을 닫습니다.

    private void btnCancel_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Abort;
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.