2016-04-02 13 views
-1

Ich möchte die Taste in ein Formular, über Steckdose gedrückt, und simulieren die gleiche Taste drücken Sie auf dem Remote-Computer. Ich habe ein paar Beispiele im Internet gesehen, aber ich dachte, die meisten von ihnen machen den Job zu kompliziert, also versuche ich, meinen Job zu machen.OnKeyPress und keybd_event

Im Moment denke ich, die anderen Beispiele sind nicht kompliziert, aber vielleicht muss der Prozess kompliziert sein. Was ich bisher zu tun ist:

Auf dem Formular I onkeypress Veranstaltung mit dem Code haben:

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; 

Wenn ich drücke 'a' auf diesem Formular, erhalte ich die Meldung 97. Dieser Code shouldn nicht für Numpad 1?

Ja, auf der Empfangsseite, ich habe einfach:

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; 

Überraschenderweise (oder nicht), was ich auf dieser Seite zu bekommen ist die Nummer 1 auf dem Bildschirm gedruckt.

Ist es möglich, diesen Prozess so einfach wie möglich zu machen, ohne auf der Formularseite, mit onkeydown Ereignis, um zu überprüfen, ob Schicht, Großbuchstaben, Kleinbuchstaben, etc ... Die onkeypress gibt mir die "echte" Taste gedrückt (oben, unten, Symbol), deshalb versuche ich es zu benutzen.

+0

OnKeyPress sendet keine virtuellen Tastencodes. Sie suchen nach OnKeyDown und OnKeyUp. –

+0

Ich kann nicht einfach die Taste OnKeyPress gedrückt senden, und diese Presse auf der Empfängerseite simulieren? Ich sah Beispiele mit OnKeyDown/OnKeyUp, alle von ihnen müssen überprüfen, ob Shift gedrückt wird, um UpperCase, alles manuell zu setzen. Während OnKeyPress gibt mir das schon automatisch. Und die Beispiele, am Ende, über die Socket senden, wie folgt aus: '49: ('!') if (ssShift in Shift) dann CurrentSocket.SendText sonst CurrentSocket.SendText ('1') ; ' Ist nicht das Gleiche, was ich mache? – LessStress

+0

'Ord ('a')' = 97 auf jeder ASCII-Tabelle, die Sie überprüfen möchten, genau wie 'Ord ('A')' ist 65. In 'OnKeyPress' erhalten Sie ein Zeichen (deshalb ist es deklariert als 'var Key: Char'). In OnKeyPress wissen Sie nicht, ob Sie einen NumPad-Schlüssel erhalten haben oder nicht. Wie David sagte, benötigen Sie OnKeyDown oder OnKeyUp, um virtuelle Schlüsselcodes zu erhalten. –

Antwort

1

Das Problem ist, dass Sie auf Ihrer Empfangsseite Ihre Eingabe als VirtualKey behandeln, während Sie von der Sendeseite ein Zeichen senden.

Überprüfen Sie diesen Code, um den Unterschied zu sehen. Der Zweck dieses Codes ist es, den Unterschied zwischen Char-Wert und Schlüsselwert zu zeigen.

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; 

Jede Art und Weise, warum Sie einfach nicht OnKeyDown und OnKeyUp Veranstaltungen statt verwenden und neben Senden Key Wert auch ShiftState senden.?

Wenn Sie planen, einige Tastenkombinationen wie STRG + C zu senden, benötigen Sie die Informationen zum Shift-Status.

Verwandte Themen