AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Mouse position und klick an anderen Rechner Senden
Thema durchsuchen
Ansicht
Themen-Optionen

Mouse position und klick an anderen Rechner Senden

Ein Thema von davtix · begonnen am 23. Sep 2017 · letzter Beitrag vom 23. Sep 2017
Antwort Antwort
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, 12: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
davtix

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

AW: Mouse position und klick an anderen Rechner Senden

  Alt 23. Sep 2017, 13:42
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
  Mit Zitat antworten Zitat
davtix

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

AW: Mouse position und klick an anderen Rechner Senden

  Alt 23. Sep 2017, 15:41
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 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