Wie kann ich programmgesteuert ein Ereignis erstellen, das das Drücken einer Taste auf der Tastatur simuliert?
Wie kann ich programmgesteuert ein Ereignis erstellen, das das Drücken einer Taste auf der Tastatur simuliert?
Antworten:
Die Frage ist mit WPF gekennzeichnet, aber die bisherigen Antworten sind spezifische WinForms und Win32.
Erstellen Sie dazu in WPF einfach ein KeyEventArgs und rufen Sie RaiseEvent für das Ziel auf. So senden Sie beispielsweise ein KeyDown-Ereignis zum Einfügen eines Schlüssels an das aktuell fokussierte Element:
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 }
);
Diese Lösung basiert nicht auf nativen Anrufen oder Windows-Interna und sollte viel zuverlässiger sein als die anderen. Außerdem können Sie einen Tastendruck auf ein bestimmtes Element simulieren.
Beachten Sie, dass dieser Code nur für PreviewKeyDown-, KeyDown-, PreviewKeyUp- und KeyUp-Ereignisse gilt. Wenn Sie TextInput-Ereignisse senden möchten, gehen Sie stattdessen folgendermaßen vor:
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 }
);
Beachten Sie auch Folgendes:
Steuerelemente erwarten Preview-Ereignisse, z. B. sollte PreviewKeyDown vor KeyDown stehen
Mit target.RaiseEvent (...) wird das Ereignis ohne Meta-Verarbeitung wie Beschleuniger, Textkomposition und IME direkt an das Ziel gesendet. Dies ist normalerweise das, was Sie wollen. Wenn Sie jedoch aus irgendeinem Grund wirklich tun, um die tatsächlichen Tastaturtasten zu simulieren, verwenden Sie stattdessen InputManager.ProcessInput ().
Keyboard.PrimaryDevice.ActiveSource
siehe stackoverflow.com/questions/10820990/...
Ctrl+C
)
Um Schlüsselereignisse ohne Windows Forms-Kontext zu erzeugen, können Sie die folgende Methode verwenden:
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
Beispielcode ist unten angegeben:
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;
}
Liste der virtuellen Tasten definiert sind hier .
Um das vollständige Bild zu erhalten, verwenden Sie bitte den folgenden Link: http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html
Ich habe es nicht benutzt, aber SendKeys kann tun, was Sie wollen.
Verwenden Sie SendKeys, um Tastenanschläge und Tastenkombinationen an die aktive Anwendung zu senden. Diese Klasse kann nicht instanziiert werden. Verwenden Sie Senden, um einen Tastenanschlag an eine Klasse zu senden und sofort mit dem Ablauf Ihres Programms fortzufahren. Verwenden Sie SendWait, um auf Prozesse zu warten, die mit dem Tastenanschlag gestartet wurden.
System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");
Microsoft hat einige weitere Beispiele für die Verwendung hier .
Leicht! (weil jemand anderes bereits die Arbeit für uns erledigt hat ...)
Nachdem ich viel Zeit damit verbracht hatte, dies mit den vorgeschlagenen Antworten zu versuchen, stieß ich auf dieses Codeplex-Projekt Windows Input Simulator, das es so einfach wie möglich machte, einen Tastendruck zu simulieren:
Die Installation des Pakets kann über den NuGet-Paketmanager oder über die Paketmanagerkonsole erfolgen:
Install-Package InputSimulator
Verwenden Sie diese 2 Codezeilen:
inputSimulator = new InputSimulator()
inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
Und das ist es!
-------BEARBEITEN--------
Die Projektseite auf Codeplex ist aus irgendeinem Grund markiert. Dies ist der Link zur NuGet-Galerie.
Windows SendMessage API mit send WM_KEYDOWN .