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;
我有两个组成部分。在第一个中,我写了一个键盘字符,我专注于第二个,然后我使用 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;