Estou procurando a melhor maneira de implementar atalhos de teclado comuns do Windows (por exemplo Ctrl+ F, Ctrl+ N) no meu aplicativo Windows Forms em C #.
O aplicativo possui um formulário principal que hospeda muitos formulários filhos (um de cada vez). Quando um usuário pressiona Ctrl+ F, eu gostaria de mostrar um formulário de pesquisa personalizado. O formulário de pesquisa dependeria do atual formulário filho aberto no aplicativo.
Eu estava pensando em usar algo assim no evento ChildForm_KeyDown :
if (e.KeyCode == Keys.F && Control.ModifierKeys == Keys.Control)
// Show search form
Mas isso não funciona. O evento nem dispara quando você pressiona uma tecla. Qual é a solução?
c#
winforms
keyboard-shortcuts
Rockcoder
fonte
fonte
Respostas:
Você provavelmente esqueceu de definir a propriedade KeyPreview do formulário como True. A substituição do método ProcessCmdKey () é a solução genérica:
fonte
KeyPreview
é bastante indispensável. Por exemplo, ao pressionar um atalho, é necessário suprimir a entrada, mas mesmo assim permitir que umMenuStrip
evento separado seja acionado.ProcessCmdKey
Essa abordagem forçaria a duplicação da lógica de acionamento de eventos.No seu formulário principal
KeyPreview
como TrueAdicione o manipulador de eventos KeyDown com o seguinte código
fonte
A melhor maneira é usar a mnemônica de menus, ou seja, ter entradas de menu em seu formulário principal que recebam o atalho de teclado que você deseja. Todo o resto é tratado internamente e tudo o que você precisa fazer é implementar a ação apropriada que é executada no
Click
manipulador de eventos dessa entrada de menu.fonte
menu mnemonics
amostra real?Você pode até tentar este exemplo:
fonte
Se você tiver um menu, alterar a
ShortcutKeys
propriedade doToolStripMenuItem
deve fazer o truque.Caso contrário, você pode criar um e definir sua
visible
propriedade como false.fonte
No formulário principal, você deve:
Além disso, eu encontrei isso no google e queria compartilhar isso com aqueles que ainda estão procurando respostas. (para global)
Eu acho que você deve estar usando user32.dll
Leia mais em http://www.fluxbytes.com/csharp/how-to-register-a-global-hotkey-for-your-application-in-c/
fonte
A resposta de Hans poderia ser um pouco mais fácil para alguém novo, então aqui está minha versão.
Você não precisa se enganar
KeyPreview
, deixe-o definido comofalse
. Para usar o código abaixo, cole-o abaixo do seuform1_load
e execute-o F5para que ele funcione:fonte
No WinForm, sempre podemos obter o status da Chave de Controle:
fonte