나는 다음을 시도했다 :
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();
}
}
