Sunday, May 25, 2025

Laza remote


https://youtu.be/EXzfnaFpfJY?si=W_MmNgnz8N6GdVJ6

*


✅ 1. KLIJENT

📄 unit1.pas (Klijent)


unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, ExtCtrls, IdTCPClient, IdGlobal, Graphics, Dialogs, Windows, LCLIntf, LCLType, Jpeg; type TForm1 = class(TForm) IdTCPClient1: TIdTCPClient; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private procedure CaptureScreenToJPEG(Stream: TMemoryStream); procedure ListenForCommands; procedure ExecuteRemoteCommand(const Cmd: string); public end; var Form1: TForm1; implementation {$R *.lfm} procedure TForm1.CaptureScreenToJPEG(Stream: TMemoryStream); var bmp: TBitmap; jpg: TJPEGImage; DC: HDC; begin bmp := TBitmap.Create; jpg := TJPEGImage.Create; try bmp.Width := Screen.Width; bmp.Height := Screen.Height; DC := GetDC(0); BitBlt(bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, DC, 0, 0, SRCCOPY); ReleaseDC(0, DC); jpg.Assign(bmp); jpg.CompressionQuality := 50; jpg.SaveToStream(Stream); finally bmp.Free; jpg.Free; end; end; procedure TForm1.Timer1Timer(Sender: TObject); var ms: TMemoryStream; begin ms := TMemoryStream.Create; try CaptureScreenToJPEG(ms); ms.Position := 0; try IdTCPClient1.ConnectTimeout := 2000; IdTCPClient1.Connect; IdTCPClient1.IOHandler.WriteLn(IntToStr(ms.Size)); IdTCPClient1.IOHandler.Write(ms, ms.Size); IdTCPClient1.Disconnect; except // greška u konekciji, ignoriši end; finally ms.Free; end; ListenForCommands; end; procedure TForm1.ListenForCommands; begin try IdTCPClient1.Host := '127.0.0.1'; // IP servera IdTCPClient1.Port := 9001; IdTCPClient1.ConnectTimeout := 2000; IdTCPClient1.Connect; while IdTCPClient1.Connected do begin ExecuteRemoteCommand(IdTCPClient1.IOHandler.ReadLn); end; except // bez konekcije end; end; procedure TForm1.ExecuteRemoteCommand(const Cmd: string); var x, y: Integer; begin if Pos('CLICK', Cmd) = 1 then begin x := StrToIntDef(ExtractWord(2, Cmd, [' ']), 0); y := StrToIntDef(ExtractWord(3, Cmd, [' ']), 0); SetCursorPos(x, y); mouse_event(MOUSEEVENTF_LEFTDOWN or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); end else if Pos('KEY', Cmd) = 1 then begin keybd_event(StrToIntDef(ExtractWord(2, Cmd, [' ']), 0), 0, 0, 0); keybd_event(StrToIntDef(ExtractWord(2, Cmd, [' ']), 0), 0, KEYEVENTF_KEYUP, 0); end; end; procedure TForm1.FormCreate(Sender: TObject); begin IdTCPClient1.Host := '127.0.0.1'; IdTCPClient1.Port := 9000; Timer1.Interval := 1000; Timer1.Enabled := True; end; end.

📄 unit1.lfm (forma za klijenta)


object Form1: TForm1 Caption = 'Remote Client' ClientHeight = 120 ClientWidth = 200 OnCreate = FormCreate object IdTCPClient1: TIdTCPClient Port = 9000 Host = '127.0.0.1' end object Timer1: TTimer Interval = 1000 OnTimer = Timer1Timer end end

✅ 2. SERVER

📄 unit1.pas (Server)


unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, IdTCPServer, IdContext, IdGlobal, StdCtrls, Windows, LCLIntf, LCLType, Jpeg; type TForm1 = class(TForm) IdTCPServer1: TIdTCPServer; Image1: TImage; procedure FormCreate(Sender: TObject); procedure IdTCPServer1Execute(AContext: TIdContext); procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private procedure SendCommandToClient(const Cmd: string); public end; var Form1: TForm1; ClientContext: TIdContext = nil; implementation {$R *.lfm} procedure TForm1.FormCreate(Sender: TObject); begin IdTCPServer1.DefaultPort := 9000; IdTCPServer1.Active := True; Self.KeyPreview := True; end; procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); var SizeStr: string; ImgStream: TMemoryStream; JPEG: TJPEGImage; Size: Integer; begin ClientContext := AContext; SizeStr := AContext.Connection.IOHandler.ReadLn; Size := StrToIntDef(SizeStr, 0); if Size <= 0 then Exit; ImgStream := TMemoryStream.Create; JPEG := TJPEGImage.Create; try AContext.Connection.IOHandler.ReadStream(ImgStream, Size, False); ImgStream.Position := 0; JPEG.LoadFromStream(ImgStream); Image1.Picture.Assign(JPEG); finally JPEG.Free; ImgStream.Free; end; end; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin SendCommandToClient('CLICK ' + IntToStr(X) + ' ' + IntToStr(Y)); end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin SendCommandToClient('KEY ' + IntToStr(Key)); end; procedure TForm1.SendCommandToClient(const Cmd: string); begin if Assigned(ClientContext) then begin try ClientContext.Connection.IOHandler.WriteLn(Cmd); except // greška prilikom slanja komande end; end; end; end.

📄 unit1.lfm (forma za server)


object Form1: TForm1 Caption = 'Remote Server' ClientHeight = 500 ClientWidth = 800 OnCreate = FormCreate OnKeyDown = FormKeyDown KeyPreview = True object Image1: TImage Align = alClient OnMouseDown = Image1MouseDown end object IdTCPServer1: TIdTCPServer DefaultPort = 9000 OnExecute = IdTCPServer1Execute end end

📌 Napomena:

  • Server prima slike i prikazuje ih, a klik/tastatura šalje natrag klijentu kroz TCP konekciju.

  • Trenutno je ClientContext memorisan globalno – ovo funkcioniše ako je samo jedan klijent, za više klijenata bi trebalo održavati listu konekcija.

  • IP adrese i portovi se mogu menjati prema tvojoj mrežnoj konfiguraciji.

 

No comments:

Post a Comment

Excel remoter