Szukam najlepszego sposobu na implementację typowych skrótów klawiaturowych Windows (na przykład Ctrl+ F, Ctrl+ N) w mojej aplikacji Windows Forms w C #.
Aplikacja ma główny formularz, który obsługuje wiele formularzy podrzędnych (pojedynczo). Gdy użytkownik naciśnie Ctrl+ F, chciałbym wyświetlić niestandardowy formularz wyszukiwania. Formularz wyszukiwania będzie zależał od bieżącego otwartego formularza potomnego w aplikacji.
Myślałem o użyciu czegoś takiego w zdarzeniu ChildForm_KeyDown :
if (e.KeyCode == Keys.F && Control.ModifierKeys == Keys.Control)
// Show search form
Ale to nie działa. Wydarzenie nie uruchamia się nawet po naciśnięciu klawisza. Jakie jest rozwiązanie?
c#
winforms
keyboard-shortcuts
Rockcoder
źródło
źródło
Odpowiedzi:
Prawdopodobnie zapomniałeś ustawić właściwość KeyPreview formularza na True. Przesłonięcie metody ProcessCmdKey () to ogólne rozwiązanie:
źródło
KeyPreview
jest to niezbędne. Na przykład naciśnięcie skrótu jest wymagane, aby stłumić wejście, ale mimo to umożliwić uruchomienie osobnegoMenuStrip
zdarzenia.ProcessCmdKey
podejście wymusiłoby powielenie logiki wyzwalania zdarzeń.W formularzu głównym
KeyPreview
na TrueDodaj moduł obsługi zdarzeń KeyDown z następującym kodem
źródło
Najlepszym sposobem jest użycie mnemoników menu, tj. Aby mieć pozycje menu w głównej formie, które zostaną przypisane do odpowiedniego skrótu klawiaturowego. Następnie wszystko inne jest obsługiwane wewnętrznie i wszystko, co musisz zrobić, to zaimplementować odpowiednią akcję, która zostanie wykonana w
Click
module obsługi zdarzeń tej pozycji menu.źródło
menu mnemonics
prawdziwa próbka?Możesz nawet spróbować tego przykładu:
źródło
Jeśli masz menu, możesz zmienić
ShortcutKeys
właściwośćToolStripMenuItem
powinna załatwić sprawę.Jeśli nie, możesz go utworzyć i ustawić jego wartość
visible
false.źródło
Z głównego formularza musisz:
Ponadto znalazłem to w google i chciałem udostępnić to tym, którzy wciąż szukają odpowiedzi. (dla globalnych)
Myślę, że musisz używać user32.dll
Dalej przeczytaj ten http://www.fluxbytes.com/csharp/how-to-register-a-global-hotkey-for-your-application-in-c/
źródło
Odpowiedź Hansa mogłaby być nieco łatwiejsza dla kogoś nowego, więc oto moja wersja.
Nie musisz oszukiwać
KeyPreview
, pozostaw to ustawieniefalse
. Aby użyć poniższego kodu, po prostu wklej go poniżej swojegoform1_load
i uruchom, F5aby zobaczyć, jak działa:źródło
W WinForm zawsze możemy uzyskać status klucza kontrolnego poprzez:
źródło