Einzelnen Beitrag anzeigen

davtix

Registriert seit: 29. Mai 2003
Ort: Berlin
87 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Mouse position und klick an anderen Rechner Senden

  Alt 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;
  Mit Zitat antworten Zitat