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

Schreibe einen Kommentar