.NET에서 KeyDown과 KeyPress의 차이점은 무엇입니까?


185

의 이벤트 KeyDown와 KeyPress이벤트 의 차이점은 무엇입니까 .net?

답변:


308

이것에 대해 많은 오해가 있습니다!

사이의 유일한 실질적인 차이점 KeyDown과 KeyPress, 즉 KeyPress문자가 키 누름에 의한 릴레이, 및 존재하는 경우에만 호출된다.

다시 말해, A키보드 를 누르면 다음 과 같은 일련의 이벤트가 발생합니다.

  1. KeyDown : KeyCode = Keys.A, KeyData = Keys.A, 수정 자 = Keys.None
  2. KeyPress : KeyChar = 'a'
  3. 키업 : KeyCode = Keys.A

그러나 Shift+ 를 누르면 A다음과 같은 결과가 나타납니다.

  1. KeyDown : KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, 수정 자 = Keys.Shift
  2. KeyDown : KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = 키 .Shift
  3. KeyPress : KeyChar = 'A'
  4. 키업 : KeyCode = Keys.A
  5. KeyUp : KeyCode = Keys.ShiftKey

키를 잠시 누르고 있으면 다음과 같은 결과가 나타납니다.

  1. KeyDown : KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, 수정 자 = Keys.Shift
  2. KeyDown : KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, 수정 자 = Keys.Shift
  3. KeyDown : KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, 수정 자 = Keys.Shift
  4. KeyDown : KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, 수정 자 = Keys.Shift
  5. KeyDown : KeyCode = Keys.ShiftKey, KeyData = Keys.ShiftKey, Shift, 수정 자 = Keys.Shift
  6. KeyDown : KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = 키 .Shift
  7. KeyPress : KeyChar = 'A'
  8. KeyDown : KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = 키 .Shift
  9. KeyPress : KeyChar = 'A'
  10. KeyDown : KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = 키 .Shift
  11. KeyPress : KeyChar = 'A'
  12. KeyDown : KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = 키 .Shift
  13. KeyPress : KeyChar = 'A'
  14. KeyDown : KeyCode = Keys.A, KeyData = Keys.A | Keys.Shift, Modifiers = 키 .Shift
  15. KeyPress : KeyChar = 'A'
  16. 키업 : KeyCode = Keys.A
  17. KeyUp : KeyCode = Keys.ShiftKey

공지 사항 KeyPress이 발생 사이에 KeyDown 하고 KeyUp, 하지 후 KeyUp, 다른 답변의 대부분은 언급 한 바와 같이, 그 KeyPress캐릭터가 생성되지 때 호출되지 않으며, 그 KeyDown키를 누르고있는 동안 다른 답변의 많은 또한, 반대로 반복한다 .

직접 호출 하지 않는 키의 예 KeyPress:

  • Shift, Ctrl,Alt
  • F1 ...을 통하여 F12
  • 화살표 키

키의 예 할 호출에서 결과를 KeyPress:

  • A관통 Z, 0관통 9등
  • Spacebar
  • Tab (KeyChar = '\ t', ASCII 9)
  • Enter (KeyChar = '\ r', ASCII 13)
  • Esc (KeyChar = '\ x1b', ASCII 27)
  • Backspace (KeyChar = '\ b', ASCII 8)

호기심의 경우, KeyDown약에 상관 관계 WM_KEYDOWN, KeyPress에 WM_CHAR, 그리고 KeyUp에 WM_KEYUP. WM_KEYDOWN 수 키 반복의 수보다 적은 수라고하지만, IIRC는, 윈폼 사용하는 반복마다 정확히 하나에서 KeyDown를 생성하는 반복 횟수를 전송한다.


2
훌륭한 설명, thx, 하나의 경고, 탈출은 Chrome에서 KeyPress를 트리거하지 않습니다 (다른 것에 대해서는 확실하지 않음).
— 바니

3
@BarnabasSzabolcs : Chrome에서 .NET을 실행합니까?
— P Daddy

@ PDaddy ups, 나는 간과했다. 나는 그것이 자바 스크립트라고 생각했다. 건배 :)
— 바니

@PDaddy 적어도 Tab은 기본적으로 KeyDown 또는 KeyUp을 실행하지 않는다는 것을 알고 있습니다
— PsychoData

@PsychoData : Tab 키가 포커스를 변경하기 때문에 입력으로 처리되지 않습니다. is 또는 일 ProcessDialogKey때 false 를 무시 하고 반환하면 (On) Key (Down | Press | Up)에 Tab 키가 표시됩니다. keyDataKeys.TabKeys.Shift | Keys.Tab
— P Daddy

73

KeyPress 이벤트는 문자가 아닌 키로 발생하지 않습니다. 그러나 문자가 아닌 키는 KeyDown 및 KeyUp 이벤트를 발생시킵니다.

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress.aspx


17
다른 답변들 대부분은 어떤 식 으로든 틀리지 만, 이것은 현실에 가장 가깝습니다. KeyPress는 문자 키에 대해서만 발생하며 키보드 입력 지연 / 반복 설정을 따릅니다. 실제 이벤트 순서는 다음과 같습니다. 1) KeyDown 2) 문자 키 KeyPress 1 회 이상 (시스템 설정 및 키 보유 시간에 따라) 3) KeyUp
— Filip Navara

나는 그것을 할 담당자가 없지만 누군가가 위키를 파괴하고 위의 의견과 수락 된 답변의 내용을 결합 할 수 있습니까?
— Josh Kodroff

11
Filip Navara의 의견은 전적으로 정확하지 않습니다. 키를 누르고 있으면 KeyDown, KeyPress, KeyDown, KeyPress, KeyDown, KeyPress KeyUp이 표시됩니다. 반복 할 때마다 KeyDown이 호출됩니다.
— P 아빠

9

KeyPress는 인쇄 가능한 문자로만 시작되며 KeyDown 이벤트 후에 시작됩니다. 타이핑 지연 설정에 따라 여러 KeyDown 및 KeyPress 이벤트가 있지만 하나의 KeyUp 이벤트 만있을 수 있습니다.

KeyDown
KeyPress
KeyUp


당신은 가까이 있지만 시퀀스에 대해 벗어났습니다.
— P Daddy

@ P Daddy-수정했습니다. 메모리에서 가기 전에 다시 확인해야합니다.
— stevehipwell

@ Stevo3000, fyi : 인쇄 할 수없는 유니 코드 문자도 KeyPress 이벤트를 발생시킵니다. 바코드 리더로 텍스트 상자에 삽입 한 데이터를 읽는 앱이 있는데 리더에는 인쇄 할 수없는 유니 코드 문자가 포함되어 있습니다.
— Jeff LaFay

@jlafay- MSDN 에 따름 문자가 아닌 키로 KeyPress 이벤트가 발생하지 않습니다. 그러나 문자가 아닌 키는 KeyDown 및 KeyUp 이벤트를 발생시킵니다.
— stevehipwell 8

@ Stevo3000, 바코드 스캐너가 텍스트 상자에 텍스트를 입력하는 방법을 모르겠지만 KeyPress가 보내는 특수 문자에 대해 발생합니다. 값은 인쇄 할 수없는 문자로 시작하고 인쇄 할 수없는 문자로 끝납니다. 그래서 그것이 사실이라면 어떻게 발사되는지 잘 모르겠습니다. 어쩌면 IL Spy의 이벤트를 포함하는 .Net 어셈블리를 살펴보고 실제로 감지되는 것을 더 잘 살펴볼 것입니다.
— Jeff LaFay

5

KeyPress는 KeyDown (및 KeyUp)보다 높은 추상화 수준입니다. KeyDown 및 KeyUp은 하드웨어와 관련이 있습니다 : 키보드에서 키의 실제 동작. KeyPress 더 "키보드에서 문자를 받았습니다".


4

MSDN에서 :

주요 이벤트는 다음 순서로 발생합니다.

  1. 키 다운

  2. 키 누름

  3. 키업

또한 KeyPress를 사용하면 작업 이 수행되지 않도록 작업을 " 처리됨 " 으로 선언 할 수 있습니다.


참고로, KeyDown 및 KeyUp에는 KeyPress와 다른 키 이벤트 사이에 있지 않도록 설정할 수있는 Handled 속성도 있습니다.
— Jeff LaFay

FWIW KeyDown과 마찬가지로 KeyUp은 KeyEventArgs 매개 변수를 가져 오지만 해당 Handled속성은 KeyUp에 대해 작동하지 않습니다 ( SuppressKeyPress작동하지 않음).
— JonP


3

Keydown은 키를 놓지 않고 키를 누르는 것입니다. Keypress는 완전한 프레스 및 릴리스주기입니다.

달리 말하면, KeyDown + KeyUp = Keypress


3
MSDN에 따르면, 이벤트 시퀀스에서 KeyDown, 누르기, keyUp 등이다 ( msdn.microsoft.com/en-us/library/... )
— 네이 쿠프

@RobCowell 또한 jlafay가 지적한 것처럼 KeyPress는 KeyDown 또는 KeyUp에 전혀 의존하지 않습니다.
— PsychoData

1

에서 블로깅 개발자 :

keydown과 keypress의 차이점을 이해하려면 "character" 와 "key" 의 차이점을 이해하는 것이 유용합니다 . "키" 잠시 컴퓨터 키보드의 물리적 버튼입니다 "문자" 버튼을 눌러 입력 한 상징입니다. 이론적으로를 keyDown과의 keyup 이벤트를 나타냅니다 키 키 누르기 이벤트가 나타내고, 누르거나 놓은되는 문자 입력되는가. 이론의 구현이 모든 브라우저에서 동일하지는 않습니다.

참고 : 위에서 언급 한 사이트에서 제공 되는 주요 이벤트 테스터를 사용하여이 개념을 이해할 수도 있습니다.


1

키를 누르고있는 시간에 관계없이 키를 눌렀을 때 KEYUP은 한 번만 캡처되므로 이러한 키를 한 번만 캡처하려면 KEYUP이 적합한 이벤트입니다.


KeyPress이벤트 모두 아니라 문자가 자동 반복 기능의 결과 인 경우 물리적 키 누름에 응답하여, 입력으로부터 생성 된 모든 문자에 대해 발생된다. 키보드 입력 작동 방식 이이 동작을 문서화합니다.
— IInspectable

네 말이 맞아 답변을 업데이트하겠습니다. 정답은 KEYUP을 사용하는 것입니다. KEYUP은 하나 이상의 키 적중시 한 번 트리거됩니다.
— Michael Haephrati

더 이상 틀리지는 않지만 여전히 질문에 대답하지 않습니다. 이것은 유용하지 않습니다.
— IInspectable

0

가장 쉬운 설명 :

나는 'd'키를 잠시 누르고있다가 놓았다.

dddddd

키 다운 이벤트는 화면에 첫 번째 d가 나타나기 전에 한 번 발생했으며, 키 누르기 이벤트는 6 번, 마지막 d가 화면에 나타난 후에 키업 이벤트가 발생했습니다.


젠장, 질문을 잘못 읽고 내 머리에 그것을 그는 자바 스크립트를 의미
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.