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

📄 filemgr.cpp

📁 远程控制系统,可以实现局域网内进行远程控制计算机,很方便,并且是学习用的非常好的资料.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// filemgrview.cpp: implementation of the CFileMgr class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "resource.h"
#include "common.h"

#include "ntshell.h"
#include "sockmgr1.h"
#include "inputdlg.h"
#include "filemgr.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CFileMgr::CFileMgr() : m_path(this, 1)
{
	strcpy(szCurPath, "C:\\");
}

CFileMgr::~CFileMgr()
{

}

LRESULT CFileMgr::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
	pwip = (PWND_INIT_PARAM)lParam;
	connwait = false;
	slave_sock = INVALID_SOCKET;
	filelist = NULL;
	SortColumn = 0;
	ClipboardOperation = 0;
	SizeSortOrder[0] = 0;
	SizeSortOrder[1] = 1;
	SizeSortOrder[2] = 2;
	SizeSortOrder[3] = 3;
	SizeSortOrder[4] = 4;
	SizeSortOrder[5] = 5;

	TBBUTTON tbButtons[] = {
		{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},
		{0, ID_FILEMGR_BACK, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
		{1, ID_FILEMGR_FORWARD, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
		{2, ID_FILEMGR_TOP, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
		{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},
		{3, ID_FILEMGR_RELOAD, TBSTATE_ENABLED, TBSTYLE_BUTTON, 0L, 0},
		{0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0L, -1},
	};

	CBitmap bmp;
	CImageList m_ImageList;

	bmp.LoadBitmap(IDB_BITMAP1);
	m_ImageList.Create(22, 22, ILC_COLOR24 | ILC_MASK, 4, 0);
	m_ImageList.Add(bmp, RGB(192, 192, 192));
	bmp.DeleteObject();

	m_hToolBar.Attach(GetDlgItem(IDC_FILETOOLBAR));
	m_hToolBar.SetButtonStructSize();
	//m_hToolBar.AddBitmap(sizeof(tbButtons) / sizeof(TBBUTTON), IDB_BITMAP1);
	m_hToolBar.SetImageList(m_ImageList);
	m_hToolBar.AddButtons(sizeof(tbButtons) / sizeof(TBBUTTON), tbButtons);
	m_hToolBar.SetStyle(m_hToolBar.GetStyle() | TBSTYLE_TRANSPARENT | TBSTYLE_FLAT | CCS_NODIVIDER | CCS_NORESIZE);

	m_hPathList.Attach(GetDlgItem(IDC_PATHLIST));
	m_hPathList.ModifyStyle(0, CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL);
	m_path.SubclassWindow(FindWindowEx(GetDlgItem(IDC_PATHLIST), NULL, "Edit", NULL));

	m_hFileList.Attach(GetDlgItem(IDC_FILELIST));
	m_hFileList.InsertColumn(0, "名称", LVCFMT_LEFT, 200, 0);
	m_hFileList.InsertColumn(1, "大小", LVCFMT_LEFT, 150, 0);
	m_hFileList.InsertColumn(2, "属性", LVCFMT_LEFT, 50, 0);
	m_hFileList.InsertColumn(3, "修改时间", LVCFMT_LEFT, 150, 0);

	SHFILEINFO sfi;
	ITEMIDLIST *m_pidlDesk;
	HIMAGELIST hImageList;

	SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &m_pidlDesk);

	hImageList = (HIMAGELIST)SHGetFileInfo((LPCTSTR)m_pidlDesk, 0, &sfi, sizeof(SHFILEINFO), SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_ICON);
	hImageList = m_hFileList.SetImageList(hImageList, LVSIL_NORMAL);
	ImageList_Destroy(hImageList);

	hImageList = (HIMAGELIST)SHGetFileInfo((LPCTSTR)m_pidlDesk, 0, &sfi, sizeof(SHFILEINFO), SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
	hImageList = m_hFileList.SetImageList(hImageList, LVSIL_SMALL);
	ImageList_Destroy(hImageList);

	RECT rect;
	REBARBANDINFO rbbi;

	m_hToolBar.GetWindowRect(&rect);
	rbbi.cbSize = sizeof(REBARBANDINFO);
	rbbi.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBS_BREAK;
	rbbi.fStyle = RBBS_NOVERT | RBBS_CHILDEDGE;
	rbbi.hwndChild = m_hToolBar;
	rbbi.cxMinChild = 200;
	rbbi.cyMinChild = rect.bottom - rect.top + 2;

	m_ReBar.Attach(GetDlgItem(IDC_FILEREBAR));
	m_ReBar.ModifyStyle(0, CCS_NODIVIDER | CCS_NOPARENTALIGN | RBS_VARHEIGHT | RBS_BANDBORDERS);
	m_ReBar.InsertBand(-1, &rbbi);

	m_hPathList.GetWindowRect(&rect);
	rbbi.hwndChild = m_hPathList;
	rbbi.cxMinChild = rect.right - rect.left;
	rbbi.cyMinChild = 15;

	m_ReBar.InsertBand(-1, &rbbi);

//	DWORD dwStyle = m_hFileList.GetExtendedListViewStyle();
//	dwStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP;
//	m_hFileList.SetExtendedListViewStyle(dwStyle);

	::ShowWindow(GetDlgItem(IDC_GOTO), SW_HIDE);

	return TRUE;
}

LRESULT CFileMgr::OnSocketRead(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
	int ret = RecvPack();

	if (ret == SOCKMGR_PENDING)
		return 0;

	if (ret == SOCKMGR_SOCK_FAILED)
	{
		char *p = GetErrorString();
		MessageBox(p, "", MB_ICONERROR);
		LocalFree(p);
	}

	if (ret == SOCKMGR_SUCCESS)
	{
		ULONG nDataSize = GetBufferDataSize();
		PBYTE pData = (PBYTE)HeapAlloc(GetProcessHeap(), 0, nDataSize);

		if (pData != NULL)
		{
			ReadBuffer((char *)pData, nDataSize);
			ParseDataPack(pData, nDataSize);
			HeapFree(GetProcessHeap(), 0, pData);
		}
	}

	return 0;
}

LRESULT CFileMgr::OnSocketWrite(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
	int ret = SendPack();

	if (ret == SOCKMGR_SOCK_FAILED)
	{
		char *p = GetErrorString();
		MessageBox(p, "", MB_ICONERROR);
		LocalFree(p);
	}

	return 0;
}

LRESULT CFileMgr::OnConnOk(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
	connwait = false;

	return 0;
}

LRESULT CFileMgr::OnConnTimeOut(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
	connwait = false;
	MessageBox("连接失败", "FileMgr", MB_ICONERROR);

	return 0;
}

LRESULT CFileMgr::OnConnectCreated(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
	SetSocket((SOCKET)wParam);
	NTSHELL_REQUEST req;
	req.ClientVersion = 1;
	req.Reserved = 0;
	req.RequestClass = FILEMGR_LISTDRIVE;
	WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST));
	FlushBuffer();

	return 0;
}

LRESULT CFileMgr::OnConnectClosed(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
	SetSocket(INVALID_SOCKET);

	return 0;
}

LRESULT CFileMgr::OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{/*
	RECT rcRB, rcDL;

	m_ReBar.SendMessage(WM_SIZE);
	m_ReBar.GetWindowRect(&rcRB);
	m_ReBar.MoveWindow(0, 0, LOWORD(lParam), rcRB.bottom - rcRB.top);

	m_hPathList.SendMessage(WM_SIZE);
	m_hPathList.GetWindowRect(&rcDL);
	m_hPathList.MoveWindow(7, 7 + rcRB.bottom - rcRB.top, LOWORD(lParam) - 14, 180);

	int y = rcRB.bottom - rcRB.top + rcDL.bottom - rcDL.top;
	m_hFileList.MoveWindow(7, 14 + y, LOWORD(lParam) - 14, HIWORD(lParam) - 21 - y);//*/

	m_ReBar.MoveWindow(0, 0, LOWORD(lParam), HIWORD(lParam));
	int y = m_ReBar.GetBarHeight() + m_ReBar.GetBandCount();
	m_hFileList.MoveWindow(7, 7 + y, LOWORD(lParam) - 14, HIWORD(lParam) - 14 - y);

	return TRUE;
}

LRESULT CFileMgr::OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
	m_hFileList.SetImageList(NULL, LVSIL_NORMAL);
	m_hFileList.SetImageList(NULL, LVSIL_SMALL);
	ImageList_Destroy(m_hToolBar.SetImageList(NULL));
	m_ReBar.Detach();
	m_hToolBar.Detach();
	m_hPathList.Detach();
	m_hFileList.Detach();

	if (slave_sock != INVALID_SOCKET)
	{
		closesocket(slave_sock);
		slave_sock = INVALID_SOCKET;
	}

	while (filelist != NULL)
	{
		PFILE_LIST p = filelist;
		filelist = filelist->next;
		delete []p;
	}

	return TRUE;
}

LRESULT CFileMgr::OnToolBarTop(int /*code*/, int /*id*/, HWND /*hWnd*/, BOOL& /*bHandled*/)
{
	SetCurrentPath("..");

	return 0;
}

LRESULT CFileMgr::OnToolBarReload(int /*code*/, int /*id*/, HWND /*hWnd*/, BOOL& /*bHandled*/)
{
	SetCurrentPath(szCurPath);

	return 0;
}

LRESULT CFileMgr::OnPathSelect(int code, int /*id*/, HWND /*hWnd*/, BOOL& /*bHandled*/)
{
	char szRootPath[] = "C:\\";

	switch (code)
	{
	case CBN_SELCHANGE:
		szRootPath[0] = (char)m_hPathList.GetItemData(m_hPathList.GetCurSel());
		m_hPathList.SetWindowText(szRootPath);
		SetCurrentPath(szRootPath);
		break;
	}

	return 0;
}

LRESULT CFileMgr::OnFileSelect(int wParam, LPNMHDR pNMHDR, BOOL& /*bHandled*/)
{
	NMLISTVIEW *pNMListView = (NMLISTVIEW *)pNMHDR;
	int nItem = pNMListView->iItem;
	char szFilePath[MAX_PATH];
	HMENU hMenu, hPopupMenu;
	POINT point;

	switch (pNMHDR->code)
	{
	case LVN_COLUMNCLICK:
		SortColumn = pNMListView->iSubItem;
		SizeSortOrder[SortColumn] = ~SizeSortOrder[SortColumn];
		m_hFileList.SortItems(CompareFunc, (LPARAM)SizeSortOrder[SortColumn]);
		break;

	case NM_DBLCLK:
		if (nItem >= 0 && nItem < m_hFileList.GetItemCount())
		{
			PFILE_LIST pfl = (PFILE_LIST)m_hFileList.GetItemData(nItem);

			if (pfl->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				SetCurrentPath(pfl->fileinfo.FileName);
			}
			else
			{
				wsprintf(szFilePath, "%s\\%s", szCurPath, pfl->fileinfo.FileName);
				SendCommand(FILEMGR_SIMPLYREADFILE, szFilePath);
			}
		}
		break;

	case NM_RCLICK:
		hMenu = LoadMenu(GetModuleHandle(NULL), (LPCTSTR)IDR_SUBMENU);

		if (nItem == -1)
		{
			hPopupMenu = GetSubMenu(hMenu, 3);
		}
		else
		{
			PFILE_LIST pfl = (PFILE_LIST)m_hFileList.GetItemData(nItem);

			if (pfl->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
			{
				hPopupMenu = GetSubMenu(hMenu, 4);
			}
			else
			{
				hPopupMenu = GetSubMenu(hMenu, 2);

				if (ClipboardOperation == 0)
					EnableMenuItem(hPopupMenu, IDM_FILE_PASTE, MF_GRAYED);
			}
		}

		GetCursorPos(&point);
		TrackPopupMenu(hPopupMenu, TPM_LEFTALIGN, point.x, point.y, 0, m_hWnd, NULL);

		DestroyMenu(hMenu);
		break;
	}

	return 0;
}

LRESULT CFileMgr::OnComboChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
	TCHAR chCharCode = (TCHAR)wParam;
	CString msg;

	switch (chCharCode)
	{
	case '/':
	case '*':
	case '?':
	case '"':
	case '<':
	case '>':
	case '|':
		msg.Format("无效路径字符'%c'", chCharCode);
		MessageBox(msg, "错误", MB_ICONERROR);
		break;
	default:
		bHandled = FALSE;
		break;
	}

	return 0;
}

LRESULT CFileMgr::OnFileOpen(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	if (m_hFileList.GetSelectedCount() != 1)
	{
		MessageBox("一次只能打开一个文件!", "错误", MB_ICONERROR);
		return 0;
	}

	int nItem = m_hFileList.GetSelectedIndex();

	if (nItem == -1)
		return 0;

	PFILE_LIST pfl = (PFILE_LIST)m_hFileList.GetItemData(nItem);

	if (pfl->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
		return 0;

	char szFilePath[MAX_PATH];
	sprintf(szFilePath, "%s\\%s", szCurPath, pfl->fileinfo.FileName);
	SendCommand(FILEMGR_SIMPLYREADFILE, szFilePath);

	return 0;
}

LRESULT CFileMgr::OnFileExecute(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	if (m_hFileList.GetSelectedCount() != 1)
	{
		MessageBox("一次执行下载一个文件!", "错误", MB_ICONERROR);
		return 0;
	}

	int nItem = m_hFileList.GetSelectedIndex();

	if (nItem == -1)
		return 0;

	PFILE_LIST pfl = (PFILE_LIST)m_hFileList.GetItemData(nItem);

	if (pfl->fileinfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)
		return 0;

	char szFilePath[MAX_PATH];
	sprintf(szFilePath, "%s\\%s", szCurPath, pfl->fileinfo.FileName);
	SendCommand(FILEMGR_EXECUTEFILE, szFilePath);

	return 0;
}

LRESULT CFileMgr::OnFileCut(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	if (GetSelectedFileName(ClipboardData, true))
		ClipboardOperation = 1;

	return 0;
}

LRESULT CFileMgr::OnFileCopy(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	if (GetSelectedFileName(ClipboardData, true))
		ClipboardOperation = 2;

	return 0;
}

LRESULT CFileMgr::OnFilePaste(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	FILEMGR_FILENAME2 fn;

	if (ClipboardOperation == 1)
	{
		if (MessageBox("确定要移动文件?", "提示", MB_ICONQUESTION | MB_YESNO) == IDNO)
			return 0;
	}

	int b = 0, f = 0;

	for (;;)
	{
		f = ClipboardData.Find('|', b);

		if (f == -1)
			break;

		CString newFile = szCurPath;
		CString fileName = ClipboardData.Mid(b, f - b);

		newFile += "\\";
		int i = fileName.ReverseFind('\\');
		newFile += fileName.Mid(i, fileName.GetLength() - i);
		strcpy(fn.FileName1, fileName);
		strcpy(fn.FileName2, newFile);

		switch (ClipboardOperation)
		{
		case 1:
			SendCommandEx(FILEMGR_MOVEFILE, &fn, sizeof(FILEMGR_FILENAME2));
			break;
		case 2:
			SendCommandEx(FILEMGR_COPYFILE, &fn, sizeof(FILEMGR_FILENAME2));
			break;
		}

		b = f + 1;
	}

	SetCurrentPath(szCurPath);

	return 0;
}

LRESULT CFileMgr::OnFileDownload(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	if (m_hFileList.GetSelectedCount() != 1)
	{
		MessageBox("一次只能下载一个文件!", "错误", MB_ICONERROR);
		return 0;
	}

	return 0;
}

LRESULT CFileMgr::OnFileUpload(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
	return 0;

⌨️ 快捷键说明

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