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

나는 다음을 시도했다 :

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로 설정되어 있습니다 … 내가 뭘 잘못하고 있니?



답변

이는 적절한 이벤트 핸들러 할당,, 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);
}


답변

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


답변

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


답변

받아 들여지는 대답은 실제로 정확하며 그 접근 방식을 여러 번 사용했습니다. 갑자기 더 이상 작동하지 않아서 이상하다는 것을 알았습니다. 대부분 내 중단 점이 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). 따라서 자녀 컨트롤이 귀하의 입력을 차지하지 않도록하십시오.


답변

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

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

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


답변

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


답변

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

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