我有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
的字节?
答案 0 :(得分:2)
这是可以预料的。 keybd_event
函数不接受ASCII码。它接受virtual key codes。 111
对应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;