언어
Windows Forms에서는 메시지가 컨트롤에 도달하기 전에 폼 수준에서 키보드 메시지를 처리하는 기능을 제공합니다. 이 문서에서는 해당 작업을 수행하는 방법을 보여 줍니다.
키보드 메시지 처리
활성 양식의 KeyPress 또는 KeyDown 이벤트를 처리하고 양식의 KeyPreview 속성을 true로 설정합니다. 이 속성을 사용하면 폼의 컨트롤에 도달하기 전에 키보드 입력이 폼에 도달합니다. 다음 코드 예제에서는 모든 숫자 키를 감지하고 1, 4, 7을 소비하여 KeyPress 이벤트를 처리합니다.
// Detect all numeric characters at the form level and consume 1, 4, and 7.
// Form.KeyPreview must be set to true for this event handler to be called.
void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
if (char.IsDigit(e.KeyChar))
{
MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' pressed.");
switch (e.KeyChar)
{
case '1':
case '4':
case '7':
MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' consumed.");
e.Handled = true;
break;
}
}
}
' Detect all numeric characters at the form level and consume 1, 4, and 7.
' Form.KeyPreview must be set to true for this event handler to be called.
Private Sub Form1_KeyPress(sender As Object, e As KeyPressEventArgs)
If Char.IsDigit(e.KeyChar) Then
MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' pressed.")
Select Case e.KeyChar
Case "1"c, "4"c, "7"c
MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' consumed.")
e.Handled = True
End Select
End If
End Sub
KeyPreview만으로는 충분하지 않을 때
설정 Form.KeyPreview = true 은 모든 키가 양식 수준 이벤트 처리기에 도달한다는 것을 보장하지 않습니다. 특정 키는 표준 양식 이벤트가 실행되기 전에 전처리를 거행합니다. 이러한 예외를 이해하는 것은 명령 키, 대화 상자 키 및 컨트롤 관련 입력을 올바르게 처리하는 데 중요합니다.
명령 및 대화 상자 키 전처리
양식 수준 키보드 이벤트가 발생하기 전에 Windows 이러한 메서드를 통해 특정 키를 순서대로 전처리합니다.
-
ProcessCmdKey: 메뉴 바로 가기 및 가속기와 같은 명령 키를 가로챌 수 있습니다. 이 메서드가 반환
true되면 키가 사용되며 이벤트가 발생하지 않습니다. - IsInputKey: 키가 KeyDown 이벤트를 발생시켜야 하는지 아니면 ProcessDialogKey로 이동해야 하는지를 결정합니다.
- ProcessDialogKey: 탐색 키(이스케이프, 탭, 반환 및 화살표 키)를 처리합니다. 처리된 경우 이벤트가 발생하지 않습니다.
현재 포커스된 컨트롤이 전처리 단계에서 키 입력을 소비하면, KeyPreview와 관계없이 폼은 해당 키를 받지 못합니다.
양식 수준 처리기를 우회하는 특수 사례
- Enter 및 Escape: 이러한 키는 AcceptButton 양식 이벤트에 도달하기 전과 CancelButton 그 전에 처리될 수 있습니다.
- 탭: 컨트롤 포커스 관리에서 자주 사용되며 양식 처리기에 도달하지 않습니다.
- 메뉴 바로 가기: Alt 키 조합은 메뉴 전처리에 의해 처리됩니다.
폼 수준에서 명령 키 가로채기
폼 수준에서 명령 키(메뉴 바로 가기 키 및 대화 상자 키 포함)를 처리하려면 폼에서 ProcessCmdKey를 재정의합니다. 이는 전처리 중에 표준 양식 이벤트 전에 실행됩니다.
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
// Intercept Ctrl+A for custom handling
if (keyData == (Keys.Control | Keys.A))
{
MessageBox.Show("Ctrl+A intercepted at form level");
return true; // Mark as handled
}
// Pass other keys to the base handler
return base.ProcessCmdKey(ref msg, keyData);
}
Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean
' Intercept Ctrl+A for custom handling
If keyData = (Keys.Control Or Keys.A) Then
MessageBox.Show("Ctrl+A intercepted at form level")
Return True ' Mark as handled
End If
' Pass other keys to the base handler
Return MyBase.ProcessCmdKey(msg, keyData)
End Function
특정 컨트롤에서 표준 이벤트를 발생시켜야 하는 키에는 해당 컨트롤에서 IsInputKey을 true로 설정한 PreviewKeyDown을 사용합니다.
참고하십시오
.NET Desktop feedback