Registriert seit: 29. Mai 2003
Ort: Berlin
87 Beiträge
Delphi 10.2 Tokyo Professional
|
Mouse position und klick an anderen Rechner Senden
23. Sep 2017, 13:05
Hi Leutz,
Ich möchte gerne von meinem Laptop aus, die Maus auf meinem Rechner steuern.
Dazu habe ich ein Button als Mausfeld und sende die Position als String.
Wahlweise ist das Fangen der MAus ebenso möglich.
Das ganze Funktioniert auch (server / client auf selben Rechner, ruckelfrei) (server/client verschiedene rechner, ruckelt) relativ ... naja nicht ganz Wünschenswert.
//frage 1:::: --- dritter code , mittig
gibt es eine Möglichkeit das Ende von ClientSocket1.Socket.SendText klar zu definieren?
also das der FolgeString als extra/neu erkannt wird?
//frage 2::::
der Linksklick funktioniert gar nicht obwohl dieser empfangen wird. Da auch das Mouseover Daten erstellt kommt nach dem mLk = 1( linksklick) eine mKl = 0(kein linksklick);
bei rechtsklick funktioniert es aber.
//frage 3 :::
ist es besser UDP statt TCP zu nehmen ?
//frage4 ::: wäre es viel besser für jeden Wert eine eigene verbindung herzustellen ? MausX tcp1, MausY tcp2, Rechtsklick tcp3, linksklick tcp4 ?
//SENDER button mouse move
Code:
procedure TEinstF.rkGlassButton5MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var mRk, mLk :integer; M : TPoint;
begin
if ( einstF.CheckBox16.Checked = true) then
begin
M := einstF.rkGlassButton5.ScreenToClient( mouse.CursorPos );
//if ssRight in Shift then mRk := 1 else mRk := 0;
//if ssLeft in Shift then mLk := 1 else mLk := 0;
mRk := 0;
mLk := 0;
MouseEvents(1, M.X, M.Y , mRk, mLk );
end;
end;
//sender button mouse down
Code:
procedure TEinstF.rkGlassButton5MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var mRk, mLk :integer; M : TPoint;
begin
//feld 481 x 271
if ( einstF.CheckBox16.Checked = true) then
begin
M := einstF.rkGlassButton5.ScreenToClient( mouse.CursorPos );
if ssRight in Shift then mRk := 1 end else mRk := 0;
if ssLeft in Shift then mLk := 1 end else mLk := 0;
MouseEvents(1, M.X, M.Y , mRk, mLk );
end;
end;
//sender procedure
Code:
procedure MouseEvents(IO, MousePosX, MousePosY, MouseRk, MouseLk :integer );
var resX, resY, MultiF: Extended;
begin
MultiF := 25; // io 1 sender kleines pad //feld 481 x 271 FORMAT ist // MPOS/x/588/y/158/mRk/0/mLk/1
{fup.prpa.procSockWriteAktiv = erste künstliche bremse damit vom mausfeld erst wieder daten verarbeitet werden wenn die aktuelle pos gesendet wurde /Grund Nach kurzer Zeit gab es Socket fehler beim server }
if ( einstF.CheckBox16.Checked = true) and (IO = 1) and (fup.prpa.procSockWriteAktiv = 0) then
begin
fup.prpa.procSockWriteAktiv := 1 ;
resX := (MousePosX / MultiF) * 100;
resY := (MousePosY / MultiF) * 100;
if (form1.ClientSocket1.Socket.Connected = true) then
begin
form1.ClientSocket1.Socket.SendText( 'MPOS'+'/x/'+ floattostr(resX) +'/y/'+ floattostr(resY) + '/mRk/'+ inttostr(MouseRk)+ '/mLk/'+ inttostr(MouseLk) );
//frage 1:::: gibt es eine Möglichkeit das Ende von SendText klar zu definieren?
also das der FolgeString als extra/neu erkannt wird?
fup.prpa.procSockWriteAktiv := 0 ;
end;
end;
comppanelF.ListBox1.Items.insert(0, 'MPOS'+'/x/'+ floattostr(resX) +'/y/'+ floattostr(resY) + '/mRk/'+ inttostr(MouseRk)+ '/mLk/'+ inttostr(MouseLk) );
end;
//empfänger
Code:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var st4, bef , tempP :string; p1, p2, p3 ,p4 , Mx , My , mRk, mLk :integer;
begin // FORMAT ist MPOS/x/1920/y/1080/mRk/0/mLk/1
st4 := Socket.ReceiveText;
Log(1, st4 );
//wenn string länger als 30 zeichen hat dann verwerfen
if ( length( st4 ) > 30) then EXIT;
///da der Folgestring wahrscheinlich so schnell kommt wird dieser in st4 mit rangehangen ergebnisse waren BSP: k/1MPOS/x/1920/y/1080/mRk/0/mLk/1MPOS/x/1920/y/1080/mRk/0/mLk/1MPOS/x/1920/y/1080/mRk/0/mLk/1
bef := copy( st4 , 1 , 4 ); //ersten 4 zeichen anzeigen
if (bef = 'MPOS') and ( fup.prpa.procSockReadAktiv = 0 ) then
begin
fup.prpa.procSockReadAktiv := 1; <<-- weitere künstliche bremse um die socketfehler nicht auszulösen
p1 := pos( '/x/', st4 ); //wo befindet sich x
p2 := pos( '/y/', st4 ); //wo befindet sich y
p3 := pos('/mRk/', st4); //wo befindet sich rechtsklick
p4 := pos('/mLk/', st4 ); //wo befindet sich linksklick
//x auslesen
tempP := copy( st4 , 1 , p2 -1 ); // hinten weg
Mx := strtoint( copy( tempP , p1 + 3 , length( tempP ) ) ); // vorne weg
//y auslesen
tempP := copy( st4 , 1 , p3 -1 ); // hinten weg
My := strtoint(copy( tempP , p2 + 3 , length( tempP ) )); // vorne weg
//rechtsklick auslesen
tempP := copy( st4 , 1 , p4 -1 ); // hinten weg
mRk := strtoint(copy( tempP , p3 + 5 , length( tempP ) )); // vorne weg
//linksklick auslesen
//tempP := copy( st4 , 1 , p4 -1 ); // hinten weg
Mlk := strtoint(copy( st4 , p4 + 5 , length( st4 ) )); // vorne weg
//nur maus bewegen
if (mRk = 0) and (mLk = 0) then
begin
SetCursorPos(Mx,My); fup.prpa.procSockReadAktiv := 0; EXIT;
end;
// rechtsklick
if (mRk = 1) and (mLk = 0) then
begin
mouse_event(MOUSEEVENTF_RIGHTDOWN, Mx, My, 0, 0);
mouse_event(MOUSEEVENTF_RIGHTUP, Mx, My, 0, 0);
fup.prpa.procSockReadAktiv := 0; EXIT;
end;
// linksklick
if (mRk = 1) and (mLk = 0) then
begin
mouse_event(MOUSEEVENTF_LEFTDOWN, Mx, My, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, Mx, My, 0, 0);
fup.prpa.procSockReadAktiv := 0; EXIT;
end;
fup.prpa.procSockReadAktiv := 0;
end;
end;
|