我想将按键发送到一个表单,通过套接字,并在远程计算机上模拟相同的按键。我在互联网上看到了一些例子,但我认为他们中的大多数都使工作变得复杂,所以我试图做我的工作。
现在,我认为其他例子并没有过于复杂化,但可能过程需要复杂化。我到目前为止所做的是:
在表单上,我有onkeypress事件,代码为:
procedure TForm2.FormKeyPress(Sender: TObject; var Key: Char);
begin
ShowMessage(IntToStr(Ord(Key))); //I put this here just to check the key code I'm
//sending for future reference
CurrentSocket.SendText('<|KEY|>' + Key);
end;
当我按下&#39;在这个表格上,我收到了消息97.这个代码不适用于小键盘1?
是的,在接收方,我只是:
procedure SocketThread.Execute;
var
ReceivedString: String;
parserLimit, iAux: integer;
Key: Char;
begin
try
ClientSocket.Active:= true;
while ClientSocket.Active do
begin
if ClientSocket.Socket.ReceiveLength > 0 then
begin
ReceivedString:= ClientSocket.Socket.ReceiveText;
while POS('<|KEY|>', ReceivedString) <> 0 do
begin
parserLimit:= POS('<|KEY|>', ReceivedString);
Key:= ReceivedString[parserLimit + 7];
Delete(ReceivedString, 1, parserLimit + 7);
keybd_event(Ord(Key), MapVirtualKey(Ord(Key), 0),0, 0);
keybd_event(Ord(Key), MapVirtualKey(Ord(Key), 0), KEYEVENTF_KEYUP, 0);
end;
令人惊讶(或不),我在这方面得到的是数字1,打印在屏幕上。
可以使这个过程尽可能简单,不需要在表单方面,使用onkeydown事件,检查是否有shift,大写,小写等... onkeypress给了我&#34;真实&# 34;按键(上,下,符号),这就是我尝试使用它的原因。
答案 0 :(得分:1)
问题在于,在您的接收方,您将输入视为VirtualKey,而在发送方您发送一个字符。
检查此代码以查看差异。此代码的目的是显示Char值和Key值之间的差异。
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
Memo1.Lines.Add('KeyPress:'+IntToStr(Ord(Key)));
end;
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
Memo1.Lines.Add('KeyUp:'+IntToStr(Key));
end;
为什么不简单地使用OnKeyDown和OnKeyUp事件,除了发送Key值之外,还发送ShiftState。
如果您计划发送某些快捷键组合(如CTRL + C),则需要Shift状态信息。