Różnica między wydarzeniem KeyDown, wydarzeniem KeyPress i wydarzeniem KeyUp w Visual Studio

Czy ktoś może mi powiedzieć jaka jest różnica pomiędzy wydarzeniem KeyDown, wydarzeniem KeyPress i wydarzeniem KeyUp? Sprawdziłem witrynę msdn i nie wyjaśnia to zbyt wiele.

Czy ktoś może mi powiedzieć w prostym sensie logicznym, kiedy następuje każde zdarzenie? Czuję, że wszystkie powyższe zdarzenia występują po naciśnięciu klawisza. Więc jaka jest dokładna różnica między nimi.

Author: reggie, 2011-05-03

5 answers

  • KeyDown: dzieje się, gdy osoba naciska klawisz (gdy klawiatura po raz pierwszy wykryje palec na klawiszu, dzieje się tak, gdy Klawisz jest wciśnięty).

  • Naciśnięcie klawisza: dzieje się, gdy Klawisz jest wciśnięty, a następnie zwolniony.

  • KeyUp: dzieje się, gdy klucz jest zwolniony

Masz rację, że wszystkie te zdarzenia występują, gdy Klawisz jest wciśnięty, a następnie zwolniony, w kolejności, którą opisałem powyżej.

 66
Author: Roy T.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-03 10:37:14

Dokumentacja MSDN określa kolejność, w jakiej trzy zdarzenia występują dość wyraźnie:

Kluczowe zdarzenia występują w następującej kolejności:

  1. KeyDown
  2. Klawiatura
  3. KeyUp

KeyDown jest podnoszony, gdy tylko użytkownik naciśnie klawisz na klawiaturze, podczas gdy nadal go przytrzymuje.

KeyPress jest podniesiony dla znaków klawiszy (w przeciwieństwie do KeyDown i KeyUp, które są również Podnoszone dla klawiszy niestandardowych) podczas naciśnięcia klawisza. Jest to zdarzenie "wyższego poziomu"niż KeyDown lub KeyUp i jako takie, inne dane są dostępne w EventArgs.

KeyUp jest podnoszony po zwolnieniu przez użytkownika klawisza na klawiaturze.

Ogólnie rzecz biorąc, powinieneś obsługiwać zdarzenie KeyUp w swojej aplikacji. Działania nie powinny być inicjowane w interfejsie użytkownika do momentu Po , gdy użytkownik zwolni klucz. A ponieważ KeyUp jest Zdarzenie niższego poziomu niż KeyPress, zawsze będziesz mieć na wyciągnięcie ręki mnóstwo informacji o naciśniętym klawiszu, a nawet będzie działać przy obsłudze klawiszy innych niż znakowe.


Rzeczą, którą należy zwrócić uwagę na wszystkie z tych zdarzeń, jest jednak to, że są one podnoszone tylko przez kontrolę, która ma koncentrację. Oznacza to, że jeśli naciśnięcie przycisku w formularzu jest aktualnie aktywne, żadne z kluczowych zdarzeń dla formularza nie zostanie podniesione. Jest to często mylące dla programistów nowych w .NET. najlepszym sposobem radzenia sobie z tym jest nadpisanie formularza ProcessCmdKey metoda :

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);
}
 81
Author: Cody Gray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-05 00:32:40

Oto przypadek, gdy nie chcesz używać KeyUp:

Masz listę i naciśnięcie klawisza Enter w wierszu wywołuje okno edytora. Problem: jeśli użytkownik naciśnie klawisz Enter na przycisku OK w edytorze, Zdarzenie KeyUp (np. KeyCode=Enter) spowoduje ponowne otwarcie edytora. Nie dzieje się tak, jeśli użytkownik naciśnie spację na przycisku OK edytora; w takim przypadku Zdarzenie KeyUp(np. KeyCode=Space) jest obsługiwane przez edytor przed nim zamyka.

Oto heurystyka wyboru, której używam:

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

*jeśli akcja jest taka, którą można wykonać w powszechnie używanym produkcie, na przykład Microsoft Office, takim jak CTRL + A (Dla "Wybierz wszystko"), to naśladuję zachowanie Microsoft, ponieważ do tego są przyzwyczajeni użytkownicy.

 7
Author: Jim C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-01 23:10:09

Oprócz innych odpowiedzi:

Próbując dowiedzieć się, do którego z tych zdarzeń należy podłączyć akcję, pamiętaj, że zdarzenie {[0] } zostanie wywołane wiele razy podczas przytrzymywania klawisza. Czasami chcesz tego zachowania, czasami nie. Na tej podstawie proponuję następujące użycie (na podstawie mojego doświadczenia):

(kolejność w jakiej zdarzenia są wywoływane)

KeyDown

Występuje: Po naciśnięciu klawisza i podczas przytrzymywania
Sposób użycia: Wykonaj akcję natychmiast po naciśnięciu przycisku lub nawet kilka razy po przytrzymaniu
przykład: przesuwanie kursora za pomocą klawiszy strzałek

.

Klawiatura

Występuje: Klawisz znakowy jest wciśnięty (Zdarzenie wyższego poziomu)
Usage: Wszystko co związane z pisaniem
przykład: Handle textbox input

.

KeyUp

Występuje: klucz jest wydany
Użycie: wykonywanie akcji krytycznej, która powinna wystąpić tylko raz na naciśnięcie klawisza
przykład: zapis danych do pliku

 3
Author: marsze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-18 11:24:34

KeyDown wtedy KeyPress wtedy {[2] } jest kolejność, którą znajduję.

Zazwyczaj chcesz zaczepić KeyDown, gdy jest to aplikacja, w której użytkownik przytrzymuje klawisz wejścia wielomodowego z modyfikacją trybu klawisza sterującego, jak w operacji shift-click. KeyPress służy do prostej logiki wpisywania klawiszy -- tylko uzyskiwanie uderzeń klawisza. KeyUp jest podłączony do logiki, która wykonuje po czymś innym procesy KeyPress, jak zmodyfikować zawartość pola edycji tekstu po jego głównej KeyPress logika efekt. Szczerze mówiąc, nie używam KeyUp tyle, ale czasami jest to jedyny sposób, aby uzyskać wiadomość po przetworzeniu czegoś innego KeyPress i musisz sprawdzić / naprawić, co się stało.

 2
Author: Christo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-12 05:38:54