W Windows Forms możesz w każdej chwili poznać aktualne położenie kursora dzięki klasie Cursors .
Wydaje się, że ta sama rzecz nie jest dostępna dla klawiatury. Czy można wiedzieć, czy np. ShiftKlawisz jest wciśnięty?
Czy absolutnie konieczne jest śledzenie każdego powiadomienia z klawiatury (zdarzenia KeyDown i KeyUp)?
Odpowiedzi:
Będzie to również prawdą, jeśli Ctrl+ nie Shiftdziała. Jeśli chcesz sprawdzić, czy sam Shift jest wciśnięty,
Jeśli jesteś w klasie, która dziedziczy
Control
(na przykład formularz), możesz usunąć rozszerzenieControl.
źródło
GetKeyState
API.Keyboard.Modifiers == ModifierKeys.Shift
(dla tych, którzy przybyli tutaj na wyszukiwanie)(Control.ModifierKeys & Keys.Shift) != 0
jednego można użyćControl.ModifierKeys.HasFlag(Keys.Shift)
Poniższy kod pokazuje, jak wykryć prawie wszystkie aktualnie wciśnięte klawisze, a nie tylko Shiftklawisz.
źródło
GetKeyState
byłoby bardziej wydajne. Śledzenie wszystkich kluczy nie ma sensu, gdy system Windows robi to już za Ciebie.Jeśli odwołujesz się do System.Windows.Input, możesz również zapoznać się z poniższymi informacjami
Przestrzeń nazw Keyboard może być również używana do sprawdzania stanu wciśnięcia innych klawiszy za pomocą Keyboard.IsKeyDown (Key), lub jeśli subskrybujesz zdarzenie KeyDownEvent lub podobne, argumenty zdarzenia zawierają listę aktualnie wciśniętych klawiszy.
źródło
Większość z tych odpowiedzi jest albo zbyt skomplikowana, albo wydaje mi się, że nie działają dla mnie (np. System.Windows.Input wydaje się nie istnieć). Potem znalazłem przykładowy kod, który działa dobrze: http://www.switchonthecode.com/tutorials/winforms-accessing-mouse-and-keyboard-state
W przypadku gdyby strona zniknęła w przyszłości, zamieszczam poniżej odpowiedni kod źródłowy:
źródło
System.Windows.Input
istnieje; dla innych borykających się z tym musisz dodać odniesienie doPresentationCore
i dodatkowe odniesienie do,WindowsBase
aby uzyskać dostęp doSystem.Windows.Input.Key
wyliczenia. Te informacje można zawsze znaleźć w witrynie MSDN.static
, nieabstract
.Od wersji .NET Framework 3.0 możliwe jest użycie
Keyboard.IsKeyDown
metody z nowejSystem.Windows.Input
przestrzeni nazw. Na przykład:Mimo że jest częścią WPF, ta metoda działa dobrze dla aplikacji WinForm (pod warunkiem, że dodasz odwołania do PresentationCore.dll i WindowsBase.dll ). Niestety, wersje 3.0 i 3.5 tej
Keyboard.IsKeyDown
metody nie działały w aplikacjach WinForm. Dlatego, jeśli chcesz go używać w aplikacji WinForm, musisz być ukierunkowany na .NET Framework 4.0 lub nowszy, aby działał.źródło
Keyboard.IsKeyDown
metoda działa nawet w projekcie WinForm.Możesz P / Invoke w dół do Win32 GetAsyncKeyState, aby przetestować dowolny klawisz na klawiaturze.
Do tej funkcji można przekazywać wartości z wyliczenia Keys (np. Keys.Shift), więc dodanie jej wymaga tylko kilku wierszy kodu.
źródło
Keyboard
nie został rozpoznany przez kompilator, aleGetAsyncKeystate
w user32 działał dobrze. Dzięki!źródło
Najlepszym sposobem, w jaki udało mi się zarządzać wprowadzaniem danych z klawiatury w formularzu Windows Forms, jest przetworzenie go po naciśnięciu klawisza i przed odebraniem zdarzenia przez aktywną kontrolkę. Firma Microsoft utrzymuje wbudowaną
Form
właściwość poziomu o nazwie .KeyPreview, aby ułatwić to precyzyjne:Następnie zdarzenia _KeyDown, _KeyPress i / lub _KeyUp formularza można zorganizować w celu uzyskania dostępu do zdarzeń wejściowych, zanim skoncentrowana kontrolka formularza kiedykolwiek je zobaczy, i można zastosować logikę obsługi, aby przechwycić zdarzenie w tym miejscu lub zezwolić na przejście do skoncentrowanej kontrolki formularza .
Chociaż nie jest tak strukturalnie wdzięczny jak architektura routingu zdarzeń XAML, znacznie upraszcza zarządzanie funkcjami na poziomie formularza w WinForm. Zobacz uwagi MSDN dotyczące KeyPreview, aby poznać zastrzeżenia.
źródło
działa dla pola tekstowego, jeśli powyższy kod znajduje się w zdarzeniu keydown formularza i żadna inna kontrolka nie przechwytuje zdarzenia keydown dla klawisza w dół.
Można również chcieć zatrzymać dalsze przetwarzanie klucza za pomocą:
źródło
Pozycja kursora x / y jest właściwością, a naciśnięcie klawisza (podobnie jak kliknięcie myszą / przesunięcie myszy) jest zdarzeniem. Najlepszą praktyką jest zazwyczaj pozwalanie, aby interfejs był sterowany zdarzeniami. Prawie jedyny przypadek, w którym będziesz potrzebować powyższego, to sytuacja, w której próbujesz wykonać zmianę + kliknięcie myszą.
źródło
W WinForms:
Brzmi to jak duplikat pytania o przepełnienie stosu Wykryj klawisz Shift został naciśnięty bez używania zdarzeń w Windows Forms? .
źródło