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

远程控制编程

开发平台:

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, ExtCtrls, Menus, ScktComp, StdCtrls, WinSock, comctrls, JPEG,
  10.   RXSplit, RXCtrls, ShellApi, ImgList, Commctrl, IniFiles;
  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.   TfMain = class(TForm)
  22.     mM: TMainMenu;
  23.     mMenu: TMenuItem;
  24.     mLink: TMenuItem;
  25.     mDo: TMenuItem;
  26.     N4: TMenuItem;
  27.     mExit: TMenuItem;
  28.     PageControl1: TPageControl;
  29.     tscr: TTabSheet;
  30.     tsys: TTabSheet;
  31.     imgShow: TImage;
  32.     cc1: TClientSocket;
  33.     cc2: TClientSocket;
  34.     lview: TListView;
  35.     RxSplitter1: TRxSplitter;
  36.     ldrv: TListBox;
  37.     labpath: TRxLabel;
  38.     ImageList1: TImageList;
  39.     popm: TPopupMenu;
  40.     popup: TMenuItem;
  41.     popdown: TMenuItem;
  42.     z1: TMenuItem;
  43.     poprun: TMenuItem;
  44.     popdel: TMenuItem;
  45.     N1: TMenuItem;
  46.     OpenDialog1: TOpenDialog;
  47.     SaveDialog1: TSaveDialog;
  48.     stb: TStatusBar;
  49.     msgbox: TComboBox;
  50.     prb: TProgressBar;
  51.     sb1: TScrollBar;
  52.     sb2: TScrollBar;
  53.     procedure FormCreate(Sender: TObject);
  54.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  55.     procedure cc1Read(Sender: TObject; Socket: TCustomWinSocket);
  56.     procedure cc2Read(Sender: TObject; Socket: TCustomWinSocket);
  57.     procedure mLinkClick(Sender: TObject);
  58.     procedure mDoClick(Sender: TObject);
  59.     procedure mExitClick(Sender: TObject);
  60.     procedure ldrvDblClick(Sender: TObject);
  61.     procedure lviewDblClick(Sender: TObject);
  62.     procedure popupClick(Sender: TObject);
  63.     procedure popdownClick(Sender: TObject);
  64.     procedure cc1Error(Sender: TObject; Socket: TCustomWinSocket;
  65.       ErrorEvent: TErrorEvent; var ErrorCode: Integer);
  66.     procedure poprunClick(Sender: TObject);
  67.     procedure popdelClick(Sender: TObject);
  68.     procedure FormResize(Sender: TObject);
  69.     procedure sb2Change(Sender: TObject);
  70.     procedure sb1Change(Sender: TObject);
  71.   private
  72.     { Private declarations }
  73.   public
  74.     { Public declarations }
  75.   end;
  76. CONST
  77.   tport = 9638;
  78.   sport = 9635;
  79. var
  80.   fMain: TfMain;
  81.   MyStream: TMemorystream;{内存流对象}
  82.   MySize  : Longint;
  83.   scF,csF : File;
  84.   jx      : integer;
  85.   jxget   : boolean;
  86.   upfilename: string;
  87.   fi: integer;
  88. implementation
  89. {$R *.dfm}
  90. {$R winxp.res}
  91. procedure smsg(msg: string);
  92. begin
  93.   fmain.msgbox.Items.Add('消息:'+msg);
  94.   fmain.msgbox.ItemIndex := fmain.msgbox.Items.Count -1;
  95. end;
  96. function GetFileSize(Path:string):integer;
  97. var
  98.   Sear:TSearchRec;
  99. begin
  100.   if FindFirst(Path,faArchive,Sear)=0 then
  101.     Result := Sear.Size div 1024
  102.   else
  103.     Result := 0;
  104. end;
  105. procedure TfMain.FormCreate(Sender: TObject);
  106. begin
  107.   cc1.Port := tport;
  108.   cc2.Port := sport;
  109.   MyStream := TMemorystream.Create;
  110. end;
  111. procedure TfMain.FormClose(Sender: TObject; var Action: TCloseAction);
  112. //关闭窗口
  113. begin
  114.   if not mLink.Checked then
  115.     mLink.Checked := true;
  116.   mLinkClick(self);
  117.   MyStream.Free;
  118. end;
  119. procedure TfMain.FormResize(Sender: TObject);
  120. begin
  121.   msgbox.Top := tsys.ClientHeight - stb.Height+3 ;
  122.   msgbox.Left := 353;
  123.   msgbox.Width := tsys.ClientWidth - 353;
  124.   prb.Top := tsys.ClientHeight - stb.Height +4;
  125.   prb.Left := 1;
  126.   prb.Width := 198;
  127.   if imgShow.Width > tscr.ClientWidth then
  128.     sb1.Max := imgShow.Width - tscr.ClientWidth + 17;
  129.   if imgShow.Height > tscr.ClientHeight then
  130.     sb2.Max := imgShow.Height - tscr.ClientHeight + 17;
  131. end;
  132. procedure TfMain.mExitClick(Sender: TObject);
  133. //退出
  134. begin
  135.   close;
  136. end;
  137. procedure TfMain.cc1Read(Sender: TObject; Socket: TCustomWinSocket);
  138. var
  139.   pd: netdata;
  140.   Item: TListItem;
  141.   FileInfo:TShFileInfo;
  142. begin
  143.   if Socket.ReceiveBuf(pd, sizeof(pd))=SOCKET_ERROR then exit;
  144.   Application.ProcessMessages ;
  145.   if P_DRV IN pd.Protocol then
  146.   begin
  147.     if pd.Str = '' then
  148.       smsg('驱动器列表建立完成!')
  149.     else
  150.       ldrv.Items.Add(pd.Str);
  151.   end;
  152.   //S-C SEND FILE
  153.   if P_SEND in pd.Protocol then
  154.   begin
  155.       BlockWrite (csf, pd.Fbuf, pd.RInt);
  156.       pd.Protocol := [P_REV];
  157.       Socket.SendBuf(pd, sizeof(pd));
  158.       prb.Position := prb.Position + 1;
  159.   end;
  160.   if P_END in pd.Protocol then
  161.   begin
  162.     Closefile(csf);
  163.     smsg('S-C模式文件传送完成');
  164.   end;
  165.   // C-S SEND FILE
  166.   if C_REVC in pd.Protocol then
  167.   begin
  168.     pd.Protocol := [C_SEND];
  169.     AssignFile(csF,upfilename);
  170.     FileMode := 0;
  171.     ReSet (csf, 1);
  172.     BlockRead(csf, pd.Fbuf, 1024, pd.RInt);
  173.     if pd.RInt > 0 then
  174.       Socket.SendBuf(pd, sizeof(pd));
  175.   end;
  176.   if C_REV in pd.Protocol then
  177.   begin
  178.     pd.Protocol := [C_SEND];
  179.     BlockRead(csf, pd.Fbuf, SizeOF(pd.Fbuf), pd.RInt);
  180.     if pd.RInt >0 then
  181.       Socket.SendBuf(pd, sizeof(pd))
  182.     else
  183.     begin
  184.       CloseFile(csf);
  185.       pd.Protocol := [C_END];
  186.       Socket.SendBuf(pd,sizeof(pd));
  187.       smsg('C-S 模式文件传送完成');
  188.     end;
  189.     prb.Position := prb.Position + 1;
  190.   end;
  191.   //屏幕控制
  192.   if K_SCR in pd.Protocol then
  193.   begin
  194.     imgShow.Width := pd.RInt ;
  195.     imgShow.Height := pd.RInt * 3 div 4;
  196.     if pd.RInt > tscr.ClientWidth then
  197.       sb1.Max := pd.RInt - tscr.ClientWidth +17;
  198.     if imgShow.Height > tscr.ClientHeight then
  199.       sb2.Max := imgShow.Height - tscr.ClientHeight+17;
  200.     imgshow.Top :=0;
  201.     imgshow.Left :=0 ;
  202.     cc2.Socket.SendText('cap');
  203.   end;
  204.   //获取文件/目录
  205.   if P_LIST in pd.Protocol then
  206.   begin
  207.     if pd.Str <> '' then
  208.     begin
  209.       Item:= lview.Items.Add ;
  210.       Item.Caption := pd.Str ;
  211.       if pd.LInt > -9 then
  212.       begin
  213.         Item.SubItems.Add(IntToStr(pd.LInt div 1024)+ ' KB');
  214.         ShGetFileInfo(pchar(Item.Caption),0,FileInfo,sizeOf(fileinfo),
  215.                       SHGFI_SMALLICON or SHGFI_ICON or SHGFI_USEFILEATTRIBUTES or SHGFI_TYPENAME);
  216.         Item.SubItems.Add(FileInfo.szTypeName);
  217.         Item.ImageIndex := ImageList_AddIcon(ImageList1.Handle,FileInfo.hIcon);
  218.       end
  219.       else begin
  220.         Item.SubItems.Add('<DIR>');
  221.         Item.SubItems.Add('目录');
  222.         Item.ImageIndex := 0;
  223.       end;
  224.       Item.SubItems.Add(DateTimeToStr(FileDateToDateTime(pd.RInt)));
  225.       stb.Panels[1].Text := '共:'+IntToStr(lview.Items.Count)+'个文件';
  226.     end
  227.     else
  228.       smsg('文件列表建立完成!');
  229.   end;
  230. end;
  231. procedure TfMain.cc1Error(Sender: TObject; Socket: TCustomWinSocket;
  232.   ErrorEvent: TErrorEvent; var ErrorCode: Integer);
  233. begin
  234.   ErrorCode:= 0;
  235. end;
  236. procedure TfMain.cc2Read(Sender: TObject; Socket: TCustomWinSocket);
  237. var
  238.   S               : String;
  239.   MyBuffer        : array[0..10000] of byte; {设置接收缓冲区}
  240.   MyReceviceLength: integer;
  241.   MyJpg           : TJpegimage;
  242. begin
  243.   Application.ProcessMessages ;
  244.   if MySize = 0 then
  245.   begin
  246.     S := Socket.ReceiveText;
  247.     MySize := StrToInt(S);
  248.     Socket.SendText('ready');
  249.   end
  250.   else
  251.   begin {以下为图象数据接收部分}
  252.     MyReceviceLength  := socket.ReceiveLength;
  253.     Socket.ReceiveBuf(MyBuffer, MyReceviceLength);
  254.     MyStream.Write(MyBuffer, MyReceviceLength);
  255.     if MyStream.Size >= MySize then
  256.     begin
  257.       MyStream.Position := 0;
  258.       MyJpg := TJpegImage.Create ;
  259.       try
  260.         MyJpg.LoadFromStream(mystream);
  261.         imgShow.Picture.Assign(Myjpg);
  262.       finally {以下为清除工作 }
  263.         Myjpg.Free;
  264.         if jxget then Socket.SendText('cap');
  265.         MyStream.Clear;
  266.         MySize := 0;
  267.       end;
  268.     end;
  269.   end;
  270. end;
  271. procedure TfMain.mLinkClick(Sender: TObject);
  272. //连接
  273. var
  274.   gip : string;
  275.   inif: Tinifile;
  276. begin
  277.   mLink.Checked := not mlink.Checked ;
  278.   ldrv.Clear ;
  279.   lview.Clear ;
  280.   if mlink.Checked then
  281.   begin
  282.     inif:= Tinifile.Create(ExtractFilePath(application.ExeName)+'config.ini');
  283.     gip:= inif.ReadString('IP','LAST','127.0.0.1');
  284.     if InputQuery('Getx II', '输入IP', gip) = false then
  285.     begin
  286.       mlink.Checked := false;
  287.       exit;
  288.     end;
  289.     cc1.Address := gip;
  290.     cc1.Active := true;
  291.     cc2.Address := gip ;
  292.     cc2.Active  :=true;
  293.     inif.WriteString('IP','LAST',gip);
  294.     inif.Free ; 
  295.   end
  296.   else
  297.   begin
  298.     if cc1.Active then cc1.Close ;
  299.     jxget := false;
  300.     if cc2.Active then cc2.Close ;
  301.     mDo.Checked := false;
  302.   end;
  303. end;
  304. procedure TfMain.mDoClick(Sender: TObject);
  305. //屏幕控制
  306. var
  307.   sd : string;
  308.   pp : netdata;
  309.   inif: TiniFile;
  310. begin
  311.   mdo.Checked := not mdo.Checked ;
  312.   if mdo.Checked then
  313.   begin
  314.     inif:= TiniFile.Create(ExtractFilePath(application.ExeName)+'config.ini');
  315.     sd  := inif.ReadString('SRC','HIG', '50');
  316.     if InputQuery('Getx II', '输入颜色深度', sd)= false then
  317.     begin
  318.       mDo.Checked := false;
  319.       exit;
  320.     end;
  321.     inif.WriteString('SRC','HIG',sd);
  322.     inif.Free ; 
  323.     jxget:= True;
  324.     pp.Protocol := [K_SCR];
  325.     PP.RInt     := strtoint(sd);
  326.     cc1.Socket.SendBuf(pp, sizeOf(pp));
  327.   end
  328.   else
  329.   begin
  330.     jxget:= false;
  331.   end;
  332. end;
  333. procedure TfMain.ldrvDblClick(Sender: TObject);
  334. //点击驱动器
  335. var
  336.   str: string;
  337.   dd : netdata;
  338. begin
  339.   lview.Clear ;
  340.   str:= ldrv.Items.Strings[ldrv.ItemIndex];
  341.   str:= copy(str, pos(':', str)+1, length(str))+'*.*';
  342.   dd.Protocol := [P_LIST];
  343.   dd.Str      := str;
  344.   cc1.Socket.SendBuf(dd, sizeof(dd));
  345.   labpath.Caption := copy(str,1, length(str)-3);
  346. end;
  347. procedure TfMain.lviewDblClick(Sender: TObject);
  348. //点击目录/文件
  349. var
  350.   str: string;
  351.   i: integer;
  352.   dd: netdata;
  353. begin
  354.   //mm
  355.   if not assigned(lview.Selected) then exit;
  356.   str:= lview.Selected.SubItems.Strings[0];
  357.   if (str = '<DIR>') and
  358.      (lview.Selected.Caption<>'.') and
  359.      (lview.Selected.Caption<>'..') then
  360.     labpath.Caption := labpath.Caption + lview.Selected.Caption +'';
  361.   if lview.Selected.Caption = '..' then
  362.   begin
  363.     str:='';
  364.     for i:=length(labpath.Caption)-1 downto 1 do
  365.     begin
  366.       str:= copy(labpath.Caption,i ,1)+ str;
  367.       if pos('',str)<>0 then break;
  368.     end;
  369.     labpath.Caption := copy(labpath.Caption,1, length(labpath.Caption)-length(str));
  370.   end;
  371.   if lview.Selected.Caption='.' then
  372.     labpath.Caption := copy(labpath.Caption,1,3);
  373.   dd.Protocol := [P_LIST];
  374.   dd.Str      := labpath.Caption+'*.*';
  375.   cc1.Socket.SendBuf(dd,sizeof(dd));
  376.   lview.Clear ; 
  377. end;
  378. procedure TfMain.popupClick(Sender: TObject);
  379. //上传文件
  380. var
  381.   dd: netdata;
  382. begin
  383.   if not assigned(lview.Selected) then exit;
  384.   if opendialog1.Execute then
  385.   begin
  386.     upFileName:= opendialog1.FileName ;
  387.     dd.Protocol := [C_FILE];
  388.     dd.Str := labpath.Caption + ExtractFileName(upFileName);
  389.     prb.Max := GetFileSize(upFileName);
  390.     prb.Position := 0;
  391.     if prb.Max =0 then prb.Max :=2;
  392.     cc1.Socket.SendBuf(dd,sizeof(dd));
  393.   end;
  394. end;
  395. procedure TfMain.popdownClick(Sender: TObject);
  396. //下载文件
  397. var
  398.   dd: netdata;
  399. begin
  400.   if not assigned(lview.Selected) then exit;
  401.   if lview.Selected.SubItems.Strings[0]='<DIR>' then exit;
  402.   saveDialog1.FileName:= lview.Selected.Caption;
  403.   if saveDialog1.Execute then
  404.   begin
  405.     dd.Protocol := [P_FILE];
  406.     dd.Str      := labpath.Caption + lview.Selected.Caption;
  407.     prb.Max     := StrToInt(copy(lview.Selected.SubItems.Strings[0],1,
  408.                     length(lview.Selected.SubItems.Strings[0])-3));
  409.     if prb.Max =0 then prb.Max :=2;
  410.     prb.Position := 0;
  411.     AssignFile(csF, saveDialog1.FileName);
  412.     ReWrite (csf, 1);
  413.     if IOResult = 0 then
  414.       cc1.Socket.SendBuf(dd,sizeof(dd));
  415.   end;
  416. end;
  417. procedure TfMain.poprunClick(Sender: TObject);
  418. //远程运行
  419. var
  420.   dd: netdata;
  421. begin
  422.   if not assigned(lview.Selected) then exit;
  423.   dd.Protocol := [K_RUN];
  424.   dd.Str      := labpath.Caption + lview.Selected.Caption;
  425.   cc1.Socket.SendBuf(dd,sizeof(dd));
  426. end;
  427. procedure TfMain.popdelClick(Sender: TObject);
  428. //远程删除
  429. var
  430.   dd: netdata;
  431. begin
  432.   if not assigned(lview.Selected) then exit;
  433.   dd.Protocol := [K_DEL];
  434.   dd.Str      := labpath.Caption + lview.Selected.Caption;
  435.   cc1.Socket.SendBuf(dd,sizeof(dd));
  436. end;
  437. procedure TfMain.sb2Change(Sender: TObject);
  438. begin
  439.   imgShow.Top := 0 - sb2.Position;
  440. end;
  441. procedure TfMain.sb1Change(Sender: TObject);
  442. begin
  443.   imgShow.Left := 0 - sb1.Position ;
  444. end;
  445. end.