加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读