Come posso creare a livello di codice un evento che simuli la pressione di un tasto sulla tastiera?
Come posso creare a livello di codice un evento che simuli la pressione di un tasto sulla tastiera?
Risposte:
La domanda è contrassegnata come WPF ma le risposte finora sono WinForm e Win32 specifici.
Per eseguire questa operazione in WPF, è sufficiente creare un KeyEventArgs e chiamare RaiseEvent sulla destinazione. Ad esempio, per inviare un evento KeyDown della chiave di inserimento all'elemento attualmente attivo:
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 }
);
Questa soluzione non si basa su chiamate native o interni di Windows e dovrebbe essere molto più affidabile delle altre. Consente inoltre di simulare la pressione di un tasto su un elemento specifico.
Tieni presente che questo codice è applicabile solo agli eventi PreviewKeyDown, KeyDown, PreviewKeyUp e KeyUp. Se vuoi inviare eventi TextInput, dovrai farlo invece:
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 }
);
Notare inoltre che:
I controlli si aspettano di ricevere eventi di anteprima, ad esempio PreviewKeyDown dovrebbe precedere KeyDown
L'utilizzo di target.RaiseEvent (...) invia l'evento direttamente al target senza meta-elaborazione come acceleratori, composizione del testo e IME. Normalmente è quello che vuoi. D'altra parte, se si fa davvero cosa simulare i tasti della tastiera effettivi per qualche motivo, si utilizzerà invece InputManager.ProcessInput ().
Keyboard.PrimaryDevice.ActiveSource
vedi stackoverflow.com/questions/10820990/…
Ctrl+C
.)
Per produrre eventi chiave senza contesto Windows Form, possiamo utilizzare il seguente metodo,
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
il codice di esempio è fornito di seguito:
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;
}
L'elenco delle chiavi virtuali è definito qui .
Per ottenere il quadro completo, utilizzare il collegamento sottostante, http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html
Non l'ho usato, ma SendKeys potrebbe fare quello che vuoi.
Utilizzare SendKeys per inviare sequenze di tasti e combinazioni di tasti all'applicazione attiva. Questa classe non può essere istanziata. Per inviare una sequenza di tasti a una classe e continuare immediatamente con il flusso del programma, utilizzare Invia. Per attendere eventuali processi avviati dalla sequenza di tasti, utilizzare SendWait.
System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");
Microsoft ha alcuni altri esempi di utilizzo qui .
Facilmente! (perché qualcun altro ha già fatto il lavoro per noi ...)
Dopo aver passato molto tempo a provare con le risposte suggerite, mi sono imbattuto in questo progetto codeplex Windows Input Simulator che ha reso semplice simulare la pressione di un tasto:
Installare il pacchetto, può essere eseguito o dal gestore di pacchetti NuGet o dalla console del gestore di pacchetti come:
Install-Package InputSimulator
Usa queste 2 righe di codice:
inputSimulator = new InputSimulator()
inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
E questo è tutto!
-------MODIFICARE--------
La pagina del progetto su codeplex è contrassegnata per qualche motivo, questo è il collegamento alla raccolta NuGet.
API SendMessage di Windows con invio WM_KEYDOWN .