Gast
2009-08-17, 15:38:29
Hallo erstmal,
ich versuche gerade, einen Tastendruck zu simulieren, welcher einer für längere Zeit gedrückten Taste auf der Tastatur entspricht.
.NET alleine kann mir da vermutlich nicht helfen, die Sendkeys-Klasse simuliert ja nur einen einmaligen Tastendruck mit anschließendem KeyUp. Das ganze in eine Schleife zu packen und damit sehr oft hintereinander auszuführen ist leider keine Option.
Bleibt wohl noch Pinvoke. Kennt ihr irgendeine Win32 Funktion, die sowas direkt erledigen kann? Auf pinvoke.net bin ich auf die Funktion keybd_event() gestoßen, welche (eigentlich) sher leicht WM_KEYDOWN und KEYUP Messages auswerfen können sollte. Afaik benutzt der Tastaturtreiber auch genau diese Funktion.
Leider haut das ganze nicht ganz hin:
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
keybd_event((byte)Keys.A, 0, 0, 0);
Das haut mir nur genau einmal den Buchstaben a raus, obwohl der Aufruf eigentlich nur KEYDOWN darstellen soll.
Habe auch schon andere Datentypen versucht, aber ändert nix:
[DllImport("user32.dll")]
private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
keybd_event((byte)Keys.A, 0, 0, UIntPtr.Zero);
Eigentlich sollte ja erst der Aufruf keybd_event((byte)Keys.A, 0, KEYEVENTF_KEYUP, UIntPtr.Zero); das ganze beenden, (wobei KEYEVENTF_KEYUP = 0x0002). Oder hab ich da was falsch verstanden?
Was ist falsch bei mir, oder habt ihr bessere Alternativen?
ich versuche gerade, einen Tastendruck zu simulieren, welcher einer für längere Zeit gedrückten Taste auf der Tastatur entspricht.
.NET alleine kann mir da vermutlich nicht helfen, die Sendkeys-Klasse simuliert ja nur einen einmaligen Tastendruck mit anschließendem KeyUp. Das ganze in eine Schleife zu packen und damit sehr oft hintereinander auszuführen ist leider keine Option.
Bleibt wohl noch Pinvoke. Kennt ihr irgendeine Win32 Funktion, die sowas direkt erledigen kann? Auf pinvoke.net bin ich auf die Funktion keybd_event() gestoßen, welche (eigentlich) sher leicht WM_KEYDOWN und KEYUP Messages auswerfen können sollte. Afaik benutzt der Tastaturtreiber auch genau diese Funktion.
Leider haut das ganze nicht ganz hin:
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
keybd_event((byte)Keys.A, 0, 0, 0);
Das haut mir nur genau einmal den Buchstaben a raus, obwohl der Aufruf eigentlich nur KEYDOWN darstellen soll.
Habe auch schon andere Datentypen versucht, aber ändert nix:
[DllImport("user32.dll")]
private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
keybd_event((byte)Keys.A, 0, 0, UIntPtr.Zero);
Eigentlich sollte ja erst der Aufruf keybd_event((byte)Keys.A, 0, KEYEVENTF_KEYUP, UIntPtr.Zero); das ganze beenden, (wobei KEYEVENTF_KEYUP = 0x0002). Oder hab ich da was falsch verstanden?
Was ist falsch bei mir, oder habt ihr bessere Alternativen?