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:
//sender button mouse down
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;
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:
//empfänger
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;
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; |
AW: Mouse position und klick an anderen Rechner Senden
hab schon mal ein wenig geändert
im socket read... von
Code:
zu
if (bef = 'MPOS') and ( fup.prpa.procSockReadAktiv = 0 ) then then
Code:
das läuft schon mal sehr flüssig .
if (bef = 'MPOS') then
von
Code:
zu
//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
Code:
und den Fehler gefunden warum kein Linksklick ging obwohl er empfangen wurde.
//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 von
Code:
zu
// linksklick
if (mRk = 1) and (mLk = 0) then
Code:
// linksklick
if (mRk = 0) and (mLk = 1) then |
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:
Jetzt funktionierts flüssig und ziehen/ drag and drop ist ebenso möglich
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; |
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