Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Mouse position und klick an anderen Rechner Senden (https://www.delphipraxis.net/193918-mouse-position-und-klick-anderen-rechner-senden.html)

davtix 23. Sep 2017 12:05

Mouse position und klick an anderen Rechner Senden
 
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;

davtix 23. Sep 2017 13:42

AW: Mouse position und klick an anderen Rechner Senden
 
hab schon mal ein wenig geändert


im socket read...

von
Code:
 if (bef = 'MPOS') and ( fup.prpa.procSockReadAktiv = 0 ) then then
zu
Code:
 if (bef = 'MPOS') then
das läuft schon mal sehr flüssig .



von
Code:
 //wenn string länger als 30 zeichen hat dann verwerfen
 if ( length( st4 ) > 30) then EXIT;
....
   //linksklick auslesen
   //tempP := copy( st4  , 1  , p4 -1 );                // hinten weg
   Mlk := strtoint(copy( st4  , p4 + 5  , length( st4 ) )); // vorne weg
zu
Code:
 //wenn string länger als 30 zeichen hat dann kürzen
 if ( length( st4 ) > 30) then st4 := copy( st4 , 1 , 30 );
....
   //linksklick auslesen
   tempP := copy( st4  , 1  ,  p4 + 5 );                 // hinten weg
   Mlk := strtoint(copy( tempP , p4 + 5  , length( tempP ) )); // vorne weg
und den Fehler gefunden warum kein Linksklick ging obwohl er empfangen wurde.
von
Code:
   // linksklick
   if (mRk = 1) and (mLk = 0) then
zu
Code:
  // linksklick
   if (mRk = 0) and (mLk = 1) then

davtix 23. Sep 2017 15:41

AW: Mouse position und klick an anderen Rechner Senden
 
neu
unter -> procedure TForm1.ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);

Code:

//nur maus bewegen
   SetCursorPos(Mx,My);

   if (mRk = 1) and (mLk = 0) then
    begin
     mouse_event(MOUSEEVENTF_RIGHTDOWN, Mx, My, 0, 0);
     mouse_event(MOUSEEVENTF_RIGHTUP, Mx , My, 0, 0);
    end;

   if (mLk = 1) and (fup.prpa.MemmLk = 0) then mouse_event(MOUSEEVENTF_LEFTDOWN, Mx, My, 0, 0);
   if (mLk = 0) and (fup.prpa.MemmLk = 1) then mouse_event(MOUSEEVENTF_LEFTUP, Mx, My, 0, 0);



   //letzten klickzustand speichern
   fup.prpa.MemmLk := mLk;

weiter habe ich geändert in mouse down & mouse move & mouse klick
Code:
var Shift: TShiftState;<-bei button klick

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;

  MouseEvents(1, M.X, M.Y , mRk, mLk );
 end;
Jetzt funktionierts flüssig und ziehen/ drag and drop ist ebenso möglich


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz