Delphi 按键和 keybd_event

Delphi keypress and keybd_event

我有两个组成部分。在第一个中,我写了一个键盘字符,我专注于第二个,然后我使用 keybd_event 发送键盘按下(按下和向上键)。但是,如果我按 "o",我会得到 ord(Key),它是 111(对于 ascii table 是可以的)。但是 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;

如何将 "key" 转换为 keybd_event 的字节?

这是意料之中的事情。 keybd_event function does not accept ASCII codes. It accepts virtual key codes。而111对应VK_DIVIDE.

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

如果你想伪造小写O,你需要确保CAPS LOCK关闭,然后伪造虚拟键码F 恰好是 ord('O').

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

谢谢大卫。对不起文档,英语不是我的第一语言,我也听不懂。

所以这段代码工作正常:

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;