MSDN утверждает, что keybd_event был заменен SendInput. Во время перезаписи я переключился на использование SendInput..., что было нормально, кроме при попытке отправить комбинацию клавиш Alt. В 64-разрядной системе Win7 (еще нигде не пробовал) отправка клавиши Alt вызывает длительную задержку, прежде чем нажатие клавиши станет очевидным в целевом приложении.
Есть идеи, почему? Или что я сделал не так? А пока я вернулся к keybd_event — второй версии ниже.
//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;
keybd_event
заключается в том, что ваши события могут быть совмещены с реальными. Так чтоSendInput
это работа. Не знаю, почему у тебя проблемы. Все же. - person David Heffernan   schedule 06.09.2013