OnKeyPress和keybd_event

时间:2016-04-02 15:23:20

标签: delphi

我想将按键发送到一个表单,通过套接字,并在远程计算机上模拟相同的按键。我在互联网上看到了一些例子,但我认为他们中的大多数都使工作变得复杂,所以我试图做我的工作。

现在,我认为其他例子并没有过于复杂化,但可能过程需要复杂化。我到目前为止所做的是:

在表单上,​​我有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;按键(上,下,符号),这就是我尝试使用它的原因。

1 个答案:

答案 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状态信息。