delphi – SendInput与keybd_event
发布时间:2020-12-15 09:40:51 所属栏目:大数据 来源:网络整理
导读:MSDN声明keybd_event已被SendInput取代.在重写期间,我切换到使用SendInput …除了尝试发送Alt-key组合时,这很好.在Win7 64位系统上(尚未在其他地方尝试过),在目标应用程序中显示击键之前,发送Alt键会导致长时间延迟. 有什么想法吗?或者我做错了什么?现在,
|
MSDN声明keybd_event已被SendInput取代.在重写期间,我切换到使用SendInput …除了尝试发送Alt-key组合时,这很好.在Win7 64位系统上(尚未在其他地方尝试过),在目标应用程序中显示击键之前,发送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);
keybd_event( Ord('M'),MapVirtualKey( Ord('M'),0),KEYEVENTF_KEYUP,0);
keybd_event( VK_MENU,0);
end;
解决方法
问题1
您没有初始化KeyInputCount.所以它的价值是不确定的.在第一次调用KeybdInput之前将其设置为零.或者只是摆脱它并使用长度(KeyInputs)代替. 问题2 您对dwFlags的设置不正确.不要包含KEYEVENTF_EXTENDEDKEY.您没有将它包含在调用keybd_event的代码中,并且不应将其包含在SendInput中. 更正了代码 这个版本有效. procedure SendAltM;
var
KeyInputs: array of TInput;
//--------------------------------------------
procedure KeybdInput(VKey: Byte; Flags: DWORD);
begin
SetLength(KeyInputs,Length(KeyInputs)+1);
KeyInputs[high(KeyInputs)].Itype := INPUT_KEYBOARD;
with KeyInputs[high(KeyInputs)].ki do
begin
wVk := VKey;
wScan := MapVirtualKey(wVk,0);
dwFlags := Flags;
end;
end;
begin
KeybdInput(VK_MENU,0);
KeybdInput(Ord('M'),KEYEVENTF_KEYUP);
KeybdInput(VK_MENU,KEYEVENTF_KEYUP); // Alt
SendInput(Length(KeyInputs),SizeOf(KeyInputs[0]));
end;
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
