Delphi keypress和keybd_event

时间:2017-02-08 16:04:29

标签: delphi type-conversion keypress

我有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的字节?

2 个答案:

答案 0 :(得分:2)

这是可以预料的。 keybd_event函数不接受ASCII码。它接受virtual key codes111对应VK_DIVIDE

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

如果您想伪造小写O,则需要确保 CAPS LOCK 已关闭,然后伪造虚拟密钥代码$4F的输入成为ord('O')

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

答案 1 :(得分:-1)

谢谢大卫。 Sory的文档,英语不是我的第一个语言,我不了解所有。

所以这段代码工作正常:

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;