Como posso criar programaticamente um evento que simule uma tecla sendo pressionada no teclado?
Como posso criar programaticamente um evento que simule uma tecla sendo pressionada no teclado?
Respostas:
A pergunta está marcada como WPF, mas as respostas até agora são WinForms e Win32 específicos.
Para fazer isso no WPF, basta construir um KeyEventArgs e chamar RaiseEvent no destino. Por exemplo, para enviar um evento KeyDown da tecla Insert para o elemento atualmente em foco:
var key = Key.Insert; // Key to send
var target = Keyboard.FocusedElement; // Target element
var routedEvent = Keyboard.KeyDownEvent; // Event to send
target.RaiseEvent(
new KeyEventArgs(
Keyboard.PrimaryDevice,
PresentationSource.FromVisual(target),
0,
key)
{ RoutedEvent=routedEvent }
);
Esta solução não depende de chamadas nativas ou internas do Windows e deve ser muito mais confiável do que as outras. Também permite simular um pressionamento de tecla em um elemento específico.
Observe que este código só se aplica a eventos PreviewKeyDown, KeyDown, PreviewKeyUp e KeyUp. Se você quiser enviar eventos TextInput, faça o seguinte:
var text = "Hello";
var target = Keyboard.FocusedElement;
var routedEvent = TextCompositionManager.TextInputEvent;
target.RaiseEvent(
new TextCompositionEventArgs(
InputManager.Current.PrimaryKeyboardDevice,
new TextComposition(InputManager.Current, target, text))
{ RoutedEvent = routedEvent }
);
Observe também que:
Os controles esperam receber eventos de visualização, por exemplo, PreviewKeyDown deve preceder KeyDown
O uso de target.RaiseEvent (...) envia o evento diretamente para o destino sem meta-processamento, como aceleradores, composição de texto e IME. Normalmente é isso que você deseja. Por outro lado, se você realmente fizer o que simular as teclas reais do teclado por algum motivo, deverá usar InputManager.ProcessInput ().
Keyboard.PrimaryDevice.ActiveSource
ver stackoverflow.com/questions/10820990/…
Ctrl+C
.)
Para produzir eventos chave sem o contexto do Windows Forms, podemos usar o seguinte método,
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
o código de amostra é fornecido abaixo:
const int VK_UP = 0x26; //up key
const int VK_DOWN = 0x28; //down key
const int VK_LEFT = 0x25;
const int VK_RIGHT = 0x27;
const uint KEYEVENTF_KEYUP = 0x0002;
const uint KEYEVENTF_EXTENDEDKEY = 0x0001;
int press()
{
//Press the key
keybd_event((byte)VK_UP, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
return 0;
}
A lista de chaves virtuais é definida aqui .
Para obter a imagem completa, use o link abaixo, http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html
Eu não usei, mas SendKeys pode fazer o que você quiser.
Use SendKeys para enviar pressionamentos de tecla e combinações de pressionamento de tecla para o aplicativo ativo. Esta classe não pode ser instanciada. Para enviar um pressionamento de tecla a uma classe e continuar imediatamente com o fluxo do seu programa, use Enviar. Para aguardar qualquer processo iniciado pelo pressionamento de tecla, use SendWait.
System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");
A Microsoft tem mais alguns exemplos de uso aqui .
Facilmente! (porque outra pessoa já fez o trabalho para nós ...)
Depois de passar muito tempo tentando fazer isso com as respostas sugeridas, me deparei com este projeto codeplex do Windows Input Simulator que simplificou ao máximo a simulação de um pressionamento de tecla:
A instalação do pacote pode ser feita a partir do gerenciador de pacotes NuGet ou do console do gerenciador de pacotes como:
Install-Package InputSimulator
Use estas 2 linhas de código:
inputSimulator = new InputSimulator()
inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
E é isso!
-------EDITAR--------
A página do projeto no codeplex está sinalizada por algum motivo, este é o link para a galeria NuGet.
API Windows SendMessage com send WM_KEYDOWN .