Visual Studio에서 KeyDown 이벤트, KeyPress 이벤트 및 KeyUp 이벤트의 차이점
누구든지 KeyDown
이벤트, KeyPress
이벤트 및 이벤트 의 차이점을 말해 줄 수 있습니까 KeyUp
? msdn 사이트를 확인했는데 그다지 설명하지 않습니다.
누가 각각의 사건이 발생할 때 간단한 논리적 의미로 나에게 말할 수 있습니까? 위의 모든 이벤트는 키를 누르면 발생하는 것 같습니다. 그래서 그들 사이의 정확한 차이점은 무엇입니까?
KeyDown : 사람이 키를 누를 때 발생합니다 (키보드가 키에서 손가락을 처음 감지하면 키를 눌렀을 때 발생합니다).
KeyPress : 키를 눌렀다 놓을 때 발생합니다.
KeyUp : 키를 놓을 때 발생합니다.
위에서 설명한 순서대로 키를 눌렀다가 놓을 때 이러한 모든 이벤트가 발생하는 것이 맞습니다.
MSDN 설명서 에는 세 가지 이벤트가 발생하는 순서가 명확하게 나와 있습니다.
주요 이벤트는 다음 순서로 발생합니다.
- KeyDown
- 키 누름
- KeyUp
KeyDown
사용자가 키보드를 누른 상태에서 키보드의 키를 누르면 바로 발생합니다.
KeyPress
위해 발생 문자 키를 누르고있는 동안 (또한 문자가 아닌 키에 대해 제기되어에서 KeyDown과의 keyup 달리,) 키를 누르십시오. 이것은 KeyDown 또는 KeyUp보다 "상위 수준"이벤트이므로 EventArgs
.
KeyUp
사용자가 키보드에서 키를 놓은 후 발생합니다.
일반적으로 KeyUp
애플리케이션 에서 이벤트를 처리 해야합니다. 조치까지 UI에서 시작되어서는 안 후 사용자가 키를 해제합니다. 그리고 이후 KeyUp
보다 낮은 수준의 이벤트가 KeyPress
, 당신은 항상 누른 키에 대한 여러분의 손끝에 정보를 많이해야하고, 비 문자 키를 처리하는 경우에도 작동합니다.
그러나 이러한 모든 이벤트 에 대해 주목할 점은 포커스가있는 컨트롤에 의해서만 발생한다는 것입니다. 폼에 버튼 컨트롤이 현재 포커스가있는 경우 그 말은, 당신의 키 이벤트의 어느 형태는 지금까지 발생하지 얻을 것이다. .NET을 처음 접하는 프로그래머에게는 종종 혼란 스러울 수 있습니다. 이를 처리하는 가장 좋은 방법은 양식의 ProcessCmdKey
메서드를 재정의하는 것입니다 .
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Control | Keys.A))
{
MessageBox.Show("You pressed Ctrl+A!");
}
return base.ProcessCmdKey(ref msg, keyData);
}
KeyUp을 사용하지 않으려는 경우는 다음과 같습니다.
목록 상자가 있고 행에서 Enter 키를 누르면 편집기 대화 상자가 호출됩니다. 문제 : 사용자가 편집기의 확인 버튼에서 Enter 키를 누르면 KeyUp (e.KeyCode = Enter) 이벤트가 목록 상자로 다시 누출되어 편집기가 다시 열립니다. 사용자가 편집기의 확인 버튼에있는 스페이스 바를 누르면 이런 일이 발생하지 않습니다. 이 경우 KeyUp (e.KeyCode = Space) 이벤트는 닫히기 전에 편집기에 의해 처리됩니다.
내가 사용하는 선택 휴리스틱은 다음과 같습니다.
If I'm handling the Enter key and I need to guard against a case like the one above
then I use KeyDown
Else if I'm handling key combinations (e.g. CTRL+C)
then I favor* KeyDown (KeyUp can make these awkward)
Else if I am allowing press & hold autorepeat
then I use KeyDown
Else
I use KeyUp
* 작업이 CTRL + A ( '모두 선택'의 경우)와 같이 일반적으로 사용되는 제품 (예 : Microsoft Office)에서 수행 할 수있는 작업 인 경우 사용자가 익숙한 Microsoft 동작을 모방합니다.
KeyDown
다음 KeyPress
다음 KeyUp
내가 찾을 순서입니다.
Usually you want to hook KeyDown
when it is for an application where a user holds down a key for multi-mode input with control key mode modification, like in a shift-click operation. KeyPress
is for simple key entry type logic -- just getting the key strokes. KeyUp
is hooked to put in logic that executes after something else processes KeyPress
, like to modify the contents of a text edit box after it's main KeyPress
logic has taken effect. Frankly, I don't use KeyUp
all that much, but sometimes it is the only way to get a message after something else has processed KeyPress
and you need to check on / fixup what happened.
In addition to the other answers:
When trying to figure to which of these events you should hookup your action, mind that the KeyDown
event will be fired multiple times while the key is held down. Sometimes you want this behavior, sometimes not. Based on that I suggest the following usage (based on my experience):
(Order in which events are fired)
KeyDown
Occurs: When key is pressed and while held down
Usage: Perform action immediately on button press or even multiple times when held down
Example: Moving cursor with arrow keys
.
KeyPress
Occurs: Character key is pressed (Higher level event)
Usage: Anything typing related
Example: Handle textbox input
.
KeyUp
Occurs: Key is released
Usage: Perform critical action which should only occur once per keystroke
Example: Write data to file
'Program Tip' 카테고리의 다른 글
Enum.GetValues () 반환 유형 (0) | 2020.12.14 |
---|---|
Python의 string.replace 대 re.sub 사용 (0) | 2020.12.14 |
\ n이 포함 된 Python 스트립 (0) | 2020.12.14 |
Rails에서 오류없이 파일을 삭제하는 방법 (0) | 2020.12.14 |
IIS 용 PHP 관리자가 설치되지 않음 (0) | 2020.12.14 |