【问题标题】:Delphi keypress and keybd_eventDelphi 按键和 keybd_event
【发布时间】:2017-02-08 16:04:28
【问题描述】:

我有 2 个组件。在第一个中我写了一个键盘字符,我关注第二个然后我使用keybd_event 发送键盘按下(键向下和向上键)。但是如果我按“o”,我有ord(Key),它是 111(对于 ascii 表来说可以)。但是keybd_event 打印出/

procedure TAutoComplete.AutoCompleteKeyPress(Sender: TObject; var Key: Char);
var
    iKeyValue: integer;
begin
    FXEdit.SetFocus;

    iKeyValue := ord(Key);

    keybd_event(iKeyValue, MapvirtualKey(iKeyValue, 0), 0, 0);
    keybd_event(iKeyValue, MapvirtualKey(iKeyValue, 0), KEYEVENTF_KEYUP, 0);
end;

如何将“密钥”转换为keybd_event 的字节?

【问题讨论】:

    标签: delphi type-conversion keypress


    【解决方案1】:

    这是意料之中的。 keybd_event 函数不接受 ASCII 代码。它接受virtual key codes。而111对应VK_DIVIDE

    keybd_event 的文档中明确说明了此信息。我怀疑您没有仔细阅读此文档。现在是纠正这个遗漏的时候了。

    如果你想伪造一个小写的O,你需要确保CAPS LOCK是关闭的,然后伪造输入的虚拟键码$4F恰好是@987654332 @。

    最后,您将从keybd_event 的文档中收集到的其他有用信息是您根本不应该调用它。相反,您应该致电SendInput

    【讨论】:

      【解决方案2】:

      谢谢大卫。抱歉文档,英语不是我的第一语言,我也不懂。

      所以这段代码可以正常工作:

      procedure TAutoComplete.AutoCompleteKeyPress(Sender: TObject; var Key: Char);
      var
          Input    : TInput;
          InputList: TList<TInput>;
      begin
          FXEdit.SetFocus;
      
          InputList := TList<TInput>.Create;
          try
              Input            := Default (TInput);
              Input.Itype      := INPUT_KEYBOARD;
              Input.ki.dwFlags := KEYEVENTF_UNICODE;
              Input.ki.wScan   := ord(Key);
              InputList.Add(Input);
              Input.ki.dwFlags := KEYEVENTF_UNICODE or KEYEVENTF_KEYUP;
              InputList.Add(Input);
      
              SendInput(InputList.Count, InputList.List[0], SizeOf(TInput));
          finally
              InputList.Free;
          end;
      end;
      

      【讨论】:

      • 当您可以使用 array[0..1] of TInput 代替时,TList 是多余的。如果您从可变长度字符串发送字符,TList 会更有意义,但即便如此,我也会选择动态 array of TInput 而不是 TList
      • 这没有回答所提出的问题。
      • 大卫,你的帖子告诉我方法,但不是解决方案。你解释说我必须使用“sendInput”。在这篇文章中,我编写了代码,它适用于 keyup 上的所有字符。
      • 并非如此。如果您查看此答案,您会发现它没有解决所提出问题的根本问题。这就是我投反对票的原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多