Jak mogę programowo utworzyć zdarzenie, które symulowałoby naciśnięcie klawisza na klawiaturze?
Jak mogę programowo utworzyć zdarzenie, które symulowałoby naciśnięcie klawisza na klawiaturze?
Odpowiedzi:
Pytanie jest oznaczone jako WPF, ale dotychczasowe odpowiedzi to specyficzne WinForms i Win32.
Aby to zrobić w WPF, po prostu skonstruuj KeyEventArgs i wywołaj RaiseEvent w miejscu docelowym. Na przykład, aby wysłać zdarzenie klawisza Insert KeyDown do aktualnie aktywnego elementu:
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 }
);
To rozwiązanie nie opiera się na natywnych wywołaniach ani wewnętrznych elementach systemu Windows i powinno być znacznie bardziej niezawodne niż inne. Umożliwia także symulację naciśnięcia klawisza na określonym elemencie.
Należy pamiętać, że ten kod ma zastosowanie tylko do zdarzeń PreviewKeyDown, KeyDown, PreviewKeyUp i KeyUp. Jeśli chcesz wysyłać zdarzenia TextInput, zrób to:
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 }
);
Pamiętaj również, że:
Kontrolki oczekują, że będą odbierać zdarzenia Preview, na przykład PreviewKeyDown powinno poprzedzać KeyDown
Używanie target.RaiseEvent (...) wysyła zdarzenie bezpośrednio do celu bez meta-przetwarzania, takiego jak akceleratory, skład tekstu i IME. Zwykle tego chcesz. Z drugiej strony, jeśli naprawdę robisz coś, co z jakiegoś powodu symuluje rzeczywiste klawisze klawiatury, możesz zamiast tego użyć InputManager.ProcessInput ().
Keyboard.PrimaryDevice.ActiveSource
zobaczyć stackoverflow.com/questions/10820990/...
Ctrl+C
.)
Aby utworzyć kluczowe zdarzenia bez kontekstu Windows Forms, możemy użyć następującej metody,
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
przykładowy kod podano poniżej:
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;
}
Lista kluczy wirtualnych jest zdefiniowana tutaj .
Aby uzyskać pełny obraz, użyj poniższego linku, http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html
Nie używałem tego, ale SendKeys może robić, co chcesz.
Użyj SendKeys, aby wysłać naciśnięcia klawiszy i kombinacje naciśnięć klawiszy do aktywnej aplikacji. Nie można utworzyć wystąpienia tej klasy. Aby wysłać naciśnięcie klawisza do klasy i natychmiast kontynuować pracę programu, użyj funkcji Wyślij. Aby poczekać na jakiekolwiek procesy uruchomione przez naciśnięcie klawisza, użyj SendWait.
System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");
Firma Microsoft ma tutaj więcej przykładów użycia .
Z łatwością! (ponieważ ktoś inny wykonał już za nas pracę ...)
Po spędzeniu dużo czasu na próbowaniu tego z sugerowanymi odpowiedziami natknąłem się na ten projekt Codeplex Symulator wprowadzania systemu Windows, który uprościł symulację naciśnięcia klawisza:
Zainstaluj pakiet, można to zrobić lub z menedżera pakietów NuGet lub z konsoli menedżera pakietów, takich jak:
Zainstaluj pakiet InputSimulator
Użyj tych 2 wierszy kodu:
inputSimulator = new InputSimulator()
inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
I to wszystko!
-------EDYTOWAĆ--------
Strona projektu w Codeplex jest oflagowana z jakiegoś powodu, to jest link do galerii NuGet.
Windows SendMessage API z wysyłaniem WM_KEYDOWN .