Qual é a diferença entre the KeyDowne KeyPressevents in .net?
Qual é a diferença entre the KeyDowne KeyPressevents in .net?
Respostas:
Aparentemente, há muito mal-entendido sobre isso!
A única diferença prática entre KeyDowne KeyPressé que KeyPressretransmite o caractere resultante de um pressionamento de tecla e é chamado apenas se houver um.
Em outras palavras, se você pressionar Ao teclado, receberá esta sequência de eventos:
Mas se você pressionar Shift+ A, receberá:
Se você pressionar as teclas por um tempo, obterá algo como:
Observe que KeyPressocorre entre KeyDown e KeyUp, não depois KeyUp, como muitas das outras respostas têm afirmado, que KeyPressnão é chamado quando um personagem não é gerado, e que KeyDowné repetido enquanto a tecla é pressionada, também ao contrário de muitas das outras respostas .
Exemplos de chaves que não resultam diretamente em chamadas para KeyPress:
Exemplos de chaves que fazer resultado em chamadas para KeyPress:
Para os curiosos, KeyDownaproximadamente se correlaciona com WM_KEYDOWN, KeyPresspara WM_CHARe KeyUppara WM_KEYUP. WM_KEYDOWN pode ser chamado menos que o número de repetições de chave, mas envia uma contagem de repetições que, IIRC, o WinForms usa para gerar exatamente um KeyDown por repetição.
ProcessDialogKeye retornar false quando keyDatafor Keys.Tabou Keys.Shift | Keys.Tab, verá a tecla Tab na tecla (On) (Down | Pressione | Up).
O evento KeyPress não é gerado por chaves que não sejam caracteres; no entanto, as chaves não características aumentam os eventos KeyDown e KeyUp.
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress.aspx
O KeyPress é acionado apenas por caracteres imprimíveis e é acionado após o evento KeyDown. Dependendo das configurações de atraso na digitação, pode haver vários eventos KeyDown e KeyPress, mas apenas um evento KeyUp.
KeyDown
KeyPress
KeyUp
KeyPress é um nível mais alto de abstração que KeyDown (e KeyUp). KeyDown e KeyUp estão relacionados ao hardware: a ação real de uma tecla no teclado. KeyPress é mais "recebi um caractere do teclado".
Do MSDN:
Os principais eventos ocorrem na seguinte ordem:
Além disso, o KeyPress oferece a chance de declarar a ação como " manipulada " para impedir que ela faça qualquer coisa.
Handledpropriedade é inoperante para KeyUp ( SuppressKeyPresstambém é inoperante).
Eu sempre pensei que o pressionamento de tecla acontecesse assim que você pressionava a tecla, pressionar a tecla é a ação de pressionar a tecla e soltá-la.
Encontrei isso que fornece uma explicação um pouco diferente: http://bytes.com/topic/net/answers/649131-difference-keypress-keydown-event
Keydown está pressionando a tecla sem soltá-la; Keypress é um ciclo completo de pressionar e soltar.
Em outras palavras, KeyDown + KeyUp = Keypress
Para entender a diferença entre pressionamento de tecla e pressionamento de tecla, é útil entender a diferença entre um "caractere" e uma "tecla" . Uma "tecla" é um botão físico no teclado do computador, enquanto um "caractere" é um símbolo digitado ao pressionar um botão. Em teoria, os eventos keydown e keyup representam teclas pressionadas ou liberadas, enquanto o evento keypress representa um caractere sendo digitado. A implementação da teoria não é a mesma em todos os navegadores.
Nota: Você também pode experimentar o Key Event Tester (disponível no site mencionado acima) para entender esse conceito.
A KEYUP será capturada apenas uma vez, após soltar a tecla pressionada, independentemente de quanto tempo a tecla será mantida pressionada; portanto, se você deseja capturar essa tecla apenas uma vez, KEYUP é o evento adequado para capturar.
KeyPressevento é gerado para cada caractere gerado a partir da entrada, tanto em resposta a pressionamentos de teclas físicos quanto quando o caractere é o resultado do recurso de repetição automática. Como funciona a entrada do teclado documenta esse comportamento.
Explicação mais fácil:
Eu segurei a tecla 'd' por um segundo e depois soltei.
dddddd
o evento de pressionamento de tecla ocorreu uma vez antes do primeiro d aparecer na tela, o evento de pressionamento de tecla ocorreu 6 vezes e o evento de pressionamento de tecla ocorreu após o último d aparecer na tela.