📄 fileandclientinfoctrlunit.pas
字号:
unit FileAndClientInfoCtrlUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ToolWin, ExtCtrls, Menus,
ImgList, ShellAPI, ShlObj, CommCtrl, ActiveX, xmldom, XMLIntf, msxmldom,
XMLDoc, IocpHerder, PublicFunctionUnit, winsock2, winsock,
{$WARNINGS OFF}
ShellCtrls;
{$WARNINGS ON}
const
WM_DealDataMsg = WM_USER + 107;
WM_ResetParamMsg = WM_USER + 200;
WM_OneFileTransOk = WM_USER + 301;
WM_FileTransProc = WM_USER + 302;
WM_FileTransProcBar = WM_USER + 303;
type
TFileAndInfoCtrlForm = class(TForm)
PageControl1: TPageControl;
TabSheet2: TTabSheet;
Splitter2: TSplitter;
Splitter3: TSplitter;
PanelRemote: TPanel;
ToolBar2: TToolBar;
RTBUpDir: TToolButton;
RCBTreeList: TComboBox;
ListViewFile: TListView;
PanelLocal: TPanel;
ToolBar1: TToolBar;
TBUpDir: TToolButton;
ShellComboBox: TShellComboBox;
ListViewTransmitList: TListView;
ShellListView: TShellListView;
TabSheet1: TTabSheet;
TabSheet3: TTabSheet;
TabSheet4: TTabSheet;
TabSheet5: TTabSheet;
StatusBarMsg: TStatusBar;
ImageListTransmitList: TImageList;
PopupMenu1: TPopupMenu;
PMCopy: TMenuItem;
PMCut: TMenuItem;
PMPeast: TMenuItem;
PMDelete: TMenuItem;
PMRename: TMenuItem;
N25: TMenuItem;
N16: TMenuItem;
PMRunNormal: TMenuItem;
PMRunHide: TMenuItem;
PMRunWithParam: TMenuItem;
ImageListOperateAble: TImageList;
XMLDocument1: TXMLDocument;
PopupMenuLocal: TPopupMenu;
MenuItem1: TMenuItem;
MenuItem2: TMenuItem;
MenuItem3: TMenuItem;
MenuItem4: TMenuItem;
MenuItem5: TMenuItem;
MenuItem6: TMenuItem;
MenuItem7: TMenuItem;
MenuItem8: TMenuItem;
MenuItem9: TMenuItem;
MenuItem10: TMenuItem;
RPMRefresh: TMenuItem;
RPMCreateDir: TMenuItem;
ListViewSysInfo: TListView;
ListViewProcessList: TListView;
ListViewWindowList: TListView;
ListViewService: TListView;
RPMServiceList: TPopupMenu;
RPMStartCervice: TMenuItem;
RPMStopService: TMenuItem;
RPMPauseService: TMenuItem;
RPMContinueService: TMenuItem;
RPMSetManualStart: TMenuItem;
RPMSetAutoStart: TMenuItem;
RPMSetDisableStart: TMenuItem;
RPMAddNewService: TMenuItem;
RPMDeletService: TMenuItem;
N1: TMenuItem;
RPMRefreshList: TMenuItem;
PMSystemInfo: TPopupMenu;
RPMRefreshSysInfo: TMenuItem;
RPMWindowList: TPopupMenu;
RPMCloseWindow: TMenuItem;
RPMHideWindow: TMenuItem;
RPMShowWindow: TMenuItem;
N5: TMenuItem;
RPMMinWindow: TMenuItem;
RPMMaxWindow: TMenuItem;
RPMRestoreWindow: TMenuItem;
N9: TMenuItem;
RPMRefreshWindowList: TMenuItem;
RPMBringWndToFront: TMenuItem;
RPMProcessList: TPopupMenu;
RPMTerminateProcess: TMenuItem;
RPMRefreshProcessList: TMenuItem;
ToolBar3: TToolBar;
EditSendChar: TEdit;
BSendEnterAndCtrl: TButton;
BSendEner: TButton;
TimerFileTransmit: TTimer;
FileProgressBar: TProgressBar;
N2: TMenuItem;
N3: TMenuItem;
procedure ToolBar1Resize(Sender: TObject);
procedure ToolBar2Resize(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ListViewFileDblClick(Sender: TObject);
procedure RTBUpDirClick(Sender: TObject);
procedure ShellListViewDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure ListViewFileDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure TBUpDirClick(Sender: TObject);
procedure ShellListViewDragDrop(Sender, Source: TObject; X,
Y: Integer);
procedure ListViewFileDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure PMPeastClick(Sender: TObject);
procedure PopupMenu1Popup(Sender: TObject);
procedure PMCopyClick(Sender: TObject);
procedure PMCutClick(Sender: TObject);
procedure PMDeleteClick(Sender: TObject);
procedure PMRenameClick(Sender: TObject);
procedure ListViewFileColumnClick(Sender: TObject;
Column: TListColumn);
procedure ListViewFileCompare(Sender: TObject; Item1, Item2: TListItem;
Data: Integer; var Compare: Integer);
procedure RPMCreateDirClick(Sender: TObject);
procedure RPMRefreshClick(Sender: TObject);
procedure PMRunNormalClick(Sender: TObject);
procedure PMRunHideClick(Sender: TObject);
procedure PMRunWithParamClick(Sender: TObject);
procedure PageControl1Change(Sender: TObject);
procedure RPMRefreshListClick(Sender: TObject);
procedure ListViewServiceColumnClick(Sender: TObject;
Column: TListColumn);
procedure ListViewServiceCompare(Sender: TObject; Item1,
Item2: TListItem; Data: Integer; var Compare: Integer);
procedure RPMRefreshSysInfoClick(Sender: TObject);
procedure RPMStartCerviceClick(Sender: TObject);
procedure RPMStopServiceClick(Sender: TObject);
procedure RPMPauseServiceClick(Sender: TObject);
procedure RPMContinueServiceClick(Sender: TObject);
procedure RPMSetAutoStartClick(Sender: TObject);
procedure RPMSetManualStartClick(Sender: TObject);
procedure RPMSetDisableStartClick(Sender: TObject);
procedure RPMDeletServiceClick(Sender: TObject);
procedure RPMAddNewServiceClick(Sender: TObject);
procedure RPMRefreshWindowListClick(Sender: TObject);
procedure ListViewWindowListColumnClick(Sender: TObject;
Column: TListColumn);
procedure ListViewWindowListCompare(Sender: TObject; Item1,
Item2: TListItem; Data: Integer; var Compare: Integer);
procedure RPMShowWindowClick(Sender: TObject);
procedure RPMCloseWindowClick(Sender: TObject);
procedure RPMMinWindowClick(Sender: TObject);
procedure RPMMaxWindowClick(Sender: TObject);
procedure RPMRestoreWindowClick(Sender: TObject);
procedure RPMBringWndToFrontClick(Sender: TObject);
procedure RPMHideWindowClick(Sender: TObject);
procedure RPMRefreshProcessListClick(Sender: TObject);
procedure RPMTerminateProcessClick(Sender: TObject);
procedure ListViewProcessListColumnClick(Sender: TObject;
Column: TListColumn);
procedure ListViewProcessListCompare(Sender: TObject; Item1,
Item2: TListItem; Data: Integer; var Compare: Integer);
procedure RPMServiceListPopup(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ToolBar3Resize(Sender: TObject);
procedure BSendEnerClick(Sender: TObject);
procedure BSendEnterAndCtrlClick(Sender: TObject);
procedure StatusBarMsgDrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
private
CutOrCopySourceStr : string;
CutOrCopy : DWORD;
//listview排序
SortCol : Integer;
SortWay : Integer;
//ServiceList排序
ServiceListSortCol : Integer;
ServiceListSortWay : Integer;
//窗口列表排序
WindowListSortCol : Integer;
WindowListSortWay : Integer;
//进程列表排序
ProcessListSortCol : Integer;
ProcessListSortWay : Integer;
//命令头信息
CMDHeader : TInterChangeHeader;
//变量访问你控制的临界区
ListAccessSemaphore : TRTLCriticalSection;
//开机时间,用来计算传输速度
TransmitTime : DWORD;
//文件大小
TransmitFileSize : DWORD;
//已传输的大小
CurrenrTransmitFileSize : DWORD;
procedure ReceiveNotifyMsg(var Message: TMessage); message WM_DealDataMsg;
//接受一个文件下载完成的消息
procedure ReceiveNotifyFileOkMsg(var Message: TMessage); message WM_OneFileTransOk;
//更新进度条消息
procedure ReceiveNotifyFileProcMsg(var Message: TMessage); message WM_FileTransProc;
procedure ReceiveNotifySetProBarMsg(var Message: TMessage); message WM_FileTransProcBar;
//根据xml描述文件,将信息分解
procedure XML2List(const ListType : Byte; out FileCount : DWORD);
//服务列表
procedure XML2ListService(const ListType : Byte; out FileCount : DWORD);
//窗口列表
procedure XML2ListWindow(const ListType : Byte; out FileCount : DWORD);
//进程列表
procedure XML2ListProcess(const ListType : Byte; out FileCount : DWORD);
{-------以下是文件管理函数-------}
procedure SetListViewImageList;
{ Private declarations }
public
//文件管理用
RemoteCmpedFrameArray : array[0..524288 - 1] of Char; //存放屏传压缩数据的内存池
RemoteUnCmpedFrameArray : array[0..524288 * 3 - 1] of Char; //存放屏传解压缩数据的内存池
RemoteCmpedFrameData : Pointer;
RemoteUnCmpedFrameData : Pointer;
tmpDataBuffer : TtmpBuf;//粘包处理用
//对应的socket
ClientSocket : TSocket;
//对应的主socket的单io数据指针
MainClientSocketIP_IO : PPerHandleData;
//系统管理的单io数据
SubClientSocketIP_IO : PPerHandleData;
//标题栏的数据
CaptionStr : string;
//事件,用来等待数据处理完成的通知
MsgDealDataOkNotifyEvent : THandle;
//标志是否正在关闭
IsClosing : Boolean;
//文件接受的文件流
RecvFileStream : TFileStream;
{ Public declarations }
end;
var
//上次访问的目录
LastPath : string;
//当前所在的目录
CurrentPath : string;
implementation
uses MainWindow;
{$R *.dfm}
procedure TFileAndInfoCtrlForm.ToolBar1Resize(Sender: TObject);
begin
ShellComboBox.Left := TBUpDir.Left + TBUpDir.Width;
ShellComboBox.Width := ToolBar1.Width - ShellComboBox.Left;
end;
procedure TFileAndInfoCtrlForm.ToolBar2Resize(Sender: TObject);
begin
RCBTreeList.Left := RTBUpDir.Left + RTBUpDir.Width;
RCBTreeList.Width := ToolBar2.Width - RCBTreeList.Left;
end;
procedure TFileAndInfoCtrlForm.FormCreate(Sender: TObject);
var
ProgressBarStyle : integer;
begin
//首先填充treeview的文件夹等图标,用系统的填充
SetListViewImageList;
CurrentPath := '我的电脑';
ZeroMemory(@CMDHeader, sizeof(TInterChangeHeader));
//创建一个事件
MsgDealDataOkNotifyEvent := CreateEvent(nil, False, False, 'MsgDealDataOkNotifyEvent');
IsClosing := False;
//下载列表的变量
InitializeCriticalSection(ListAccessSemaphore);
//设置第4个是可以放置其他部件的
StatusBarMsg.Panels[3].Style := psOwnerDraw;
//将进程条放入状态栏
FileProgressBar.Parent := StatusBarMsg;
FileProgressBar.Smooth := True;
//去除状态栏的边框,这样就与状态栏溶为一体了
ProgressBarStyle := GetWindowLong(FileProgressBar.Handle, GWL_EXSTYLE);
ProgressBarStyle := ProgressBarStyle - WS_EX_STATICEDGE;
SetWindowLong(FileProgressBar.Handle, GWL_EXSTYLE, ProgressBarStyle);
end;
//插入进度条到状态条
procedure TFileAndInfoCtrlForm.StatusBarMsgDrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
//注意这里的Panels[3]指的就是第4块面板,因为默认是从0开始的
if Panel = StatusBar.Panels[3] then
with FileProgressBar do begin
Top := Rect.Top;
Left := Rect.Left;
Width := Rect.Right - Rect.Left;
Height := Rect.Bottom - Rect.Top;
end;
end;
//窗口类关闭
procedure TFileAndInfoCtrlForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
IsClosing := True;
if MainClientSocketIP_IO <> nil then
Caption := CaptionStr + ',等待窗体数据关闭,请稍等';
try
if MainClientSocketIP_IO <> nil then
begin
//将主socket内的记录清零
MainClientSocketIP_IO^.AllCtrlInstance.GetSystemInfoInstance := 0;
ZeroMemory(@CMDHeader, sizeof(CMDHeader));
//关闭远类实例= 1
CMDHeader.Order := 1;
//先关闭管理socket
CMDHeader.OrderObject := GetSystemInfo;
SetCmdSignByte(MainClientSocketIP_IO^.Socket, CMDHeader, False);
//等待数据处理线程退出
Sleep(600);
end;
except
end;
//释放事件
CloseHandle(MsgDealDataOkNotifyEvent);
//删除互斥
DeleteCriticalSection(ListAccessSemaphore);
if RecvFileStream <> nil then RecvFileStream.Free;
Action := caFree;
end;
//后退功能
procedure TFileAndInfoCtrlForm.TBUpDirClick(Sender: TObject);
begin
if (ShellComboBox.Path <> '我的电脑') and (ShellComboBox.Path <> 'My Computer') then
ShellListView.Back;
end;
//接受拖拽
procedure TFileAndInfoCtrlForm.ShellListViewDragOver(Sender,
Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
if Source = ListViewFile then
Accept := True
else
Accept := False;
end;
//接受拖拽
procedure TFileAndInfoCtrlForm.ListViewFileDragOver(Sender,
Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := True;
end;
//结束拖拽,接受文件下载
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -