SendInput vs. keybd_event
MSDN besagt, dass keybd_event wurde abgelöst durch SendInput. Während eines rewrite-ich wechselte mit SendInput...das war in Ordnung außer, wenn Sie versuchen, senden Sie eine Alt-Tastenkombination. Auf einem Win7 64-bit system (habe nicht versucht, anderswo noch), senden Sie eine Alt-Taste führt zu eine lange Verzögerung, bevor der Tastenanschlag ist deutlich in die Ziel-Anwendung.
Irgendwelche Ideen, warum? Oder was hab ich falsch gemacht? Jetzt habe ich wieder keybd_event--die zweite version unten.
//Keyboard input from this version appears only after a ~4-5 second
//time lag...
procedure SendAltM;
var
KeyInputs: array of TInput;
KeyInputCount: Integer;
//--------------------------------------------
procedure KeybdInput(VKey: Byte; Flags: DWORD);
begin
Inc(KeyInputCount);
SetLength(KeyInputs, KeyInputCount);
KeyInputs[KeyInputCount - 1].Itype := INPUT_KEYBOARD;
with KeyInputs[KeyInputCount - 1].ki do
begin
wVk := VKey;
wScan := MapVirtualKey(wVk, 0);
dwFlags := KEYEVENTF_EXTENDEDKEY;
dwFlags := Flags or dwFlags;
time := 0;
dwExtraInfo := 0;
end;
end;
begin
KeybdInput(VK_MENU, 0); // Alt
KeybdInput(Ord('M'), 0);
KeybdInput(Ord('M'), KEYEVENTF_KEYUP);
KeybdInput(VK_MENU, KEYEVENTF_KEYUP); // Alt
SendInput(KeyInputCount, KeyInputs[0], SizeOf(KeyInputs[0]));
end;
//Keyboard input from this version appears immediately...
procedure SendAltM;
begin
keybd_event( VK_MENU, MapVirtualkey( VK_MENU, 0 ), 0, 0);
keybd_event( Ord('M'), MapVirtualKey( Ord('M'),0), 0, 0);
keybd_event( Ord('M'), MapVirtualKey( Ord('M'),0), KEYEVENTF_KEYUP, 0);
keybd_event( VK_MENU, MapVirtualkey( VK_MENU, 0 ), KEYEVENTF_KEYUP, 0);
end;
Dieses große problem mit
keybd_event
ist, dass Ihre Veranstaltungen bekommen kann gespleißt mit echten. So SendInput
ist der job. Keine Ahnung, warum Sie Probleme haben. Noch.InformationsquelleAutor Mark Wilsdorf | 2013-09-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Problem 1
Hast du nicht initialisieren
KeyInputCount
. So wird sein Wert undefiniert. Setzen Sie ihn auf null, vor dem AufrufKeybdInput
ersten mal. Oder einfach nur, um es loszuwerden, und verwenden SieLength(KeyInputs)
statt.Problem 2
Ihre Einstellung
dwFlags
ist falsch. Nicht enthaltenKEYEVENTF_EXTENDEDKEY
. Sie hat es nicht in den code, der Aufrufekeybd_event
, und Sie sollten es nicht fürSendInput
.Korrigierten code
Diese version funktioniert.
Das Hauptproblem ist die falsche Flagge, denke ich.
Dank David und @Rob. Ich weiß nicht, ob das nicht initialisierte KeyInputCount oder die Flagge war das problem; nur froh, dass man dies herausgefunden. Oh, und es ist so einfach zu sehen, dass KeyInputCount wurde nicht initialisiert...jetzt hat jemand darauf hingewiesen!
InformationsquelleAutor David Heffernan
diese Weise können Sie die
keybd_event
:InformationsquelleAutor Bertalan