No Windows Forms , você pode saber, a qualquer momento, a posição atual do cursor graças aos Cursores classe .
A mesma coisa não parece estar disponível para o teclado. É possível saber se, por exemplo, oShift tecla está pressionada?
É absolutamente necessário rastrear todas as notificações do teclado (eventos KeyDown e KeyUp)?
Respostas:
Isso também será verdadeiro se Ctrl+ Shiftestiver desativado. Se você quiser verificar se Shift sozinho está pressionado,
Se você estiver em uma classe que herda
Control
(como um formulário), você pode remover oControl.
fonte
GetKeyState
função API.Keyboard.Modifiers == ModifierKeys.Shift
(para aqueles que vieram aqui em busca)(Control.ModifierKeys & Keys.Shift) != 0
um pode usarControl.ModifierKeys.HasFlag(Keys.Shift)
O código abaixo é como detectar quase todas as teclas atualmente pressionadas, não apenas a Shifttecla.
fonte
GetKeyState
seria mais eficiente. Não faz sentido rastrear todas as chaves quando o Windows já faz isso por você.Você também pode observar o seguinte se fizer referência a System.Windows.Input
O espaço para nome do teclado também pode ser usado para verificar o estado pressionado de outras teclas com Keyboard.IsKeyDown (Key) ou, se você estiver assinando um KeyDownEvent ou evento semelhante, os argumentos do evento exibem uma lista de teclas pressionadas no momento.
fonte
A maioria dessas respostas é muito complicada ou parece não funcionar para mim (por exemplo, System.Windows.Input parece não existir). Então encontrei um código de exemplo que funciona bem: http://www.switchonthecode.com/tutorials/winforms-accessing-mouse-and-keyboard-state
Caso a página desapareça no futuro, estou postando o código-fonte relevante abaixo:
fonte
System.Windows.Input
existe; para outras pessoas que lutam com isso, é necessário adicionar uma referênciaPresentationCore
e uma referência adicionalWindowsBase
para acessar aSystem.Windows.Input.Key
enumeração. Esta informação sempre pode ser encontrada no MSDN.static
, nãoabstract
.Desde o .NET Framework versão 3.0, é possível usar o
Keyboard.IsKeyDown
método no novoSystem.Windows.Input
espaço para nome. Por exemplo:Embora faça parte do WPF, esse método funciona bem para aplicativos WinForm (desde que você adicione referências ao PresentationCore.dll e WindowsBase.dll ). Infelizmente, no entanto, as versões 3.0 e 3.5 do
Keyboard.IsKeyDown
método não funcionaram para aplicativos WinForm. Portanto, se você quiser usá-lo em um aplicativo WinForm, precisará direcionar o .NET Framework 4.0 ou posterior para que ele funcione.fonte
Keyboard.IsKeyDown
método funciona, mesmo em um projeto WinForm.Você pode P / Invoke até o Win32 GetAsyncKeyState para testar qualquer tecla do teclado.
Você pode passar valores da enumeração Keys (por exemplo, Keys.Shift) para essa função, portanto, são necessárias apenas algumas linhas de código para adicioná-lo.
fonte
Keyboard
não foi reconhecido pelo compilador, masGetAsyncKeystate
no user32 funcionou bem. Obrigado!fonte
A melhor maneira que encontrei para gerenciar a entrada do teclado em um formulário do Windows Forms é processá-la após o pressionamento de tecla e antes do controle focado receber o evento. A Microsoft mantém uma
Form
propriedade interna de nível chamada .KeyPreview para facilitar esta coisa precisa:Os eventos _KeyDown, _KeyPress e / ou _KeyUp do formulário podem ser empacotados para acessar eventos de entrada antes que o controle de formulário focado os veja, e você pode aplicar a lógica do manipulador para capturar o evento ou permitir que ele passe para o controle de formulário focado .
Embora não seja tão estruturalmente elegante quanto a arquitetura de roteamento de eventos do XAML , ela simplifica muito o gerenciamento de funções no nível do formulário no Winforms. Veja as notas do MSDN no KeyPreview para obter advertências.
fonte
funciona para uma caixa de texto se o código acima estiver no evento de pressionamento de tecla do formulário e nenhum outro controle captura o evento de pressionamento de tecla da tecla pressionada.
Também pode-se desejar interromper o processamento de chaves com:
fonte
A posição x / y do cursor é uma propriedade e um pressionamento de tecla (como um clique do mouse / mouse) é um evento. A melhor prática é geralmente permitir que a interface seja orientada a eventos. A única vez em que você precisaria do descrito acima é se você está tentando fazer algo com o turno + clique com o mouse.
fonte
No WinForms:
Parece que uma duplicata da pergunta Stack Overflow Detect Shift é pressionada sem o uso de eventos no Windows Forms? .
fonte