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

📄 consoleview.cpp

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

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

#include "ntshell.h"
#include "sockmgr1.h"
#include "cmdshell.h"
#include "filemgr.h"
#include "portproxy.h"
#include "procmgr.h"
#include "screenview.h"
#include "inputdlg.h"
#include "consoleView.h"

class CConsole : public CDialogImpl<CConsole>, public CSockMgr
{
public:
	enum { IDD = IDD_CONSOLE };

	BEGIN_MSG_MAP(CConsole)
		MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
//		MESSAGE_HANDLER(WM_SIZE, OnSize)
		COMMAND_CODE_HANDLER(BN_CLICKED, OnButtonClicked)
		MESSAGE_HANDLER(WM_CONNECT_CREATED, OnConnectCreated)
		MESSAGE_HANDLER(WM_CONNECT_CLOSED, OnConnectClosed)
		MESSAGE_HANDLER(WM_SOCKET_READ, OnSocketRead)
		MESSAGE_HANDLER(WM_SOCKET_WRITE, OnSocketWrite)
	END_MSG_MAP()

// Handler prototypes (uncomment arguments if needed):
//	LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
//	LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
//	LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)

	LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/);
	LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/);
	LRESULT OnButtonClicked(int /*code*/, int /*id*/, HWND /*hWnd*/, BOOL& /*bHandled*/);
	LRESULT OnConnectCreated(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
	LRESULT OnConnectClosed(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
	LRESULT OnSocketRead(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
	LRESULT OnSocketWrite(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
};

LRESULT CConsole::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
	CheckRadioButton(IDC_RADIO1, IDC_RADIO2, IDC_RADIO1);
	CheckRadioButton(IDC_RADIO3, IDC_RADIO5, IDC_RADIO3);
	SetDlgItemInt(IDC_TIMEOUT, 1000, FALSE);

	return TRUE;
}

LRESULT CConsole::OnButtonClicked(int /*code*/, int id, HWND /*hWnd*/, BOOL& /*bHandled*/)
{
	NTSHELL_REQUEST req;
	CONSOLE_MESSAGESEND ms;
	CONSOLE_PROCESSKILL pk;
	CONSOLE_EXECUTE e;
	CONSOLE_FILEDOWNLOAD fd;
	int msglen;
	char buf[MAX_PATH], *msg;

	switch (id)
	{
	case IDC_RADIO1:
	case IDC_RADIO2:
		CheckRadioButton(IDC_RADIO1, IDC_RADIO2, id);
		return TRUE;

	case IDC_RADIO3:
	case IDC_RADIO4:
	case IDC_RADIO5:
		CheckRadioButton(IDC_RADIO3, IDC_RADIO5, id);
		return TRUE;

	case IDC_CLEANUPLOG:
		int l = ::GetWindowTextLength(GetDlgItem(IDC_LOG));
		SendMessage(GetDlgItem(IDC_LOG), EM_SETSEL, 0, l);
		SendMessage(GetDlgItem(IDC_LOG), EM_REPLACESEL, FALSE, (LPARAM)"");
		return TRUE;
	}

	switch (id)
	{
	case IDC_SENDMSG:
		req.ClientVersion = 1;
		req.Reserved = 0;
		req.RequestClass = CONSOLE_SENDMESSAGE;
		req.Reserved2 = 0;
		ms.DisplayMethod = IsDlgButtonChecked(IDC_RADIO1) == BST_CHECKED ? 0 : 1;
		msglen = ::GetWindowTextLength(GetDlgItem(IDC_MESSAGE)) + 1;
		msg = (char *)HeapAlloc(GetProcessHeap(), 0, msglen);
		::GetWindowText(GetDlgItem(IDC_MESSAGE), msg, msglen);
		WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST));
		WriteBuffer((char *)&ms, sizeof(CONSOLE_MESSAGESEND));
		WriteBuffer((char *)msg, msglen);
		HeapFree(GetProcessHeap(), 0, msg);
		break;

	case IDC_LISTPROCESS:
		req.ClientVersion = 1;
		req.Reserved = 0;
		req.RequestClass = CONSOLE_LISTPROCESS;
		req.Reserved2 = 0;
		WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST));
		break;

	case IDC_KILLPROCESS:
		req.ClientVersion = 1;
		req.Reserved = 0;
		req.RequestClass = CONSOLE_KILLPROCESS;
		req.Reserved2 = 0;

		{
			CInputDlg<IDD_INPUTPID> dlg;
			TCHAR pid[INPUT_BUFFER_SIZE] = "";;
			if (dlg.DoModal(m_hWnd, (LPARAM)pid) == FALSE)
				return 0;
			pk.ProcessId = _ttoi(pid);
		}

		WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST));
		WriteBuffer((char *)&pk, sizeof(CONSOLE_PROCESSKILL));
		break;

	case IDC_EXECUTE:
		req.ClientVersion = 1;
		req.Reserved = 0;
		req.RequestClass = IsDlgButtonChecked(IDC_RADIO3) == BST_CHECKED ? CONSOLE_EXECUTE_1 : CONSOLE_EXECUTE_2;
		req.Reserved2 = 0;
		e.TimeOut = GetDlgItemInt(IDC_TIMEOUT, NULL, FALSE);
		e.ShowResult = IsDlgButtonChecked(IDC_RADIO5) == BST_CHECKED ? FALSE : TRUE;
		GetDlgItemText(IDC_COMMAND, buf, MAX_PATH);
		WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST));
		WriteBuffer((char *)&e, sizeof(CONSOLE_EXECUTE));
		WriteBuffer(buf, strlen(buf) + 1);
		break;

	case IDC_DOWNLOAD:
		req.ClientVersion = 1;
		req.Reserved = 0;
		req.RequestClass = CONSOLE_DOWNLOADFILE;
		req.Reserved2 = 0;
		fd.RunIt = FALSE;
		GetDlgItemText(IDC_URL, fd.Url, sizeof(fd.Url));
		GetDlgItemText(IDC_SAVEPATH, fd.SavePath, sizeof(fd.SavePath));
		WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST));
		WriteBuffer((char *)&fd, sizeof(CONSOLE_FILEDOWNLOAD));
		break;

	case IDC_DOWNLOADADNEXECUTE:
		req.ClientVersion = 1;
		req.Reserved = 0;
		req.RequestClass = CONSOLE_DOWNLOADFILE;
		req.Reserved2 = 0;
		fd.RunIt = TRUE;
		GetDlgItemText(IDC_URL, fd.Url, sizeof(fd.Url));
		GetDlgItemText(IDC_SAVEPATH, fd.SavePath, sizeof(fd.SavePath));
		WriteBuffer((char *)&req, sizeof(NTSHELL_REQUEST));
		WriteBuffer((char *)&fd, sizeof(CONSOLE_FILEDOWNLOAD));
		break;
	}

	FlushBuffer();

	if (SendPack() == SOCKMGR_SOCK_FAILED)
		MessageBox("连接不可用", "错误", MB_ICONERROR);

	return TRUE;
}

LRESULT CConsole::OnConnectCreated(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
	SetSocket((SOCKET)wParam);

	return 0;
}

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

	return 0;
}

LRESULT CConsole::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);
			int l = ::GetWindowTextLength(GetDlgItem(IDC_LOG));
			SendMessage(GetDlgItem(IDC_LOG), EM_SETSEL, l, l);
			SendMessage(GetDlgItem(IDC_LOG), EM_REPLACESEL, FALSE, (LPARAM)pData);
			HeapFree(GetProcessHeap(), 0, pData);
		}
	}

	return 0;
}

LRESULT CConsole::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;
}

CConsoleView::CConsoleView()
{
	m_shell = new CCmdShell();
	m_file = new CFileMgr();
	m_proxy = new CPortProxy();
	m_console = new CConsole();
	m_screen = new CScreenView();
	m_process = new CProcMgr();
}

CConsoleView::~CConsoleView()
{
	delete m_shell;
	delete m_file;
	delete m_proxy;
	delete m_console;
	delete m_screen;
	delete m_process;
}

BOOL CConsoleView::PreTranslateMessage(MSG* pMsg)
{
	if (m_shell->IsDialogMessage(pMsg) ||
		m_file->IsDialogMessage(pMsg) ||
		m_proxy->IsDialogMessage(pMsg) ||
		m_console->IsDialogMessage(pMsg) ||
		m_screen->IsDialogMessage(pMsg) ||
		m_process->IsDialogMessage(pMsg))
		return TRUE;

	return FALSE;
}

void CConsoleView::InitView(LPVOID lpParam)
{
	m_shell->Create(m_hWnd, (LPARAM)lpParam);
	m_file->Create(m_hWnd, (LPARAM)lpParam);
	m_proxy->Create(m_hWnd, (LPARAM)lpParam);
	m_console->Create(m_hWnd, (LPARAM)lpParam);
	m_screen->Create(m_hWnd, (LPARAM)lpParam);
	m_process->Create(m_hWnd, (LPARAM)lpParam);

	CFont font = m_shell->GetFont();
	SetFont(font);
	font.Detach();

	TCITEM tci;
	tci.mask = TCIF_TEXT;
	tci.pszText = "控制台";
	tci.cchTextMax = 6;
	InsertItem(0, &tci);

	tci.pszText = "命令行";
	tci.cchTextMax = 6;
	InsertItem(1, &tci);

	tci.pszText = "进程";
	tci.cchTextMax = 4;
	InsertItem(2, &tci);

	tci.pszText = "文件";
	tci.cchTextMax = 4;
	InsertItem(3, &tci);

	tci.pszText = "端口代理";
	tci.cchTextMax = 8;
	InsertItem(4, &tci);

	tci.pszText = "屏幕监视";
	tci.cchTextMax = 8;
	InsertItem(5, &tci);

	SetCurFocus(3);
}

LRESULT CConsoleView::OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
{
	bHandled = FALSE;

	RECT rc, itemrc;
	GetClientRect(&rc);
	CTabCtrl::GetItemRect(0, &itemrc);

	int x = rc.left + 2;
	int y = rc.top + itemrc.bottom + 2;
	int width = LOWORD(lParam) - x - 2;
	int height = HIWORD(lParam) - y - 2;

	if (m_console->IsWindow())
		m_console->MoveWindow(x, y, width, height);

	if (m_shell->IsWindow())
		m_shell->MoveWindow(x, y, width, height);

	if (m_file->IsWindow())
		m_file->MoveWindow(x, y, width, height);

	if (m_proxy->IsWindow())
		m_proxy->MoveWindow(x, y, width, height);

	if (m_screen->IsWindow())
		m_screen->MoveWindow(x, y, width, height);

	if (m_process->IsWindow())
		m_process->MoveWindow(x, y, width, height);

	return 0;
}

LRESULT CConsoleView::OnNotify(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
{
	switch (((LPNMHDR)lParam)->code)
	{
		case TCN_SELCHANGE:
			switch (GetCurSel())
			{
			case 0:
				m_console->ShowWindow(SW_SHOW);
				m_shell->ShowWindow(SW_HIDE);
				m_file->ShowWindow(SW_HIDE);
				m_proxy->ShowWindow(SW_HIDE);
				m_screen->ShowWindow(SW_HIDE);
				m_process->ShowWindow(SW_HIDE);
				m_console->SetFocus();
				break;
			case 1:
				m_console->ShowWindow(SW_HIDE);
				m_shell->ShowWindow(SW_SHOW);
				m_file->ShowWindow(SW_HIDE);
				m_proxy->ShowWindow(SW_HIDE);
				m_screen->ShowWindow(SW_HIDE);
				m_process->ShowWindow(SW_HIDE);
				m_shell->SetFocus();
				break;
			case 2:
				m_console->ShowWindow(SW_HIDE);
				m_shell->ShowWindow(SW_HIDE);
				m_file->ShowWindow(SW_HIDE);
				m_proxy->ShowWindow(SW_HIDE);
				m_screen->ShowWindow(SW_HIDE);
				m_process->ShowWindow(SW_SHOW);
				m_process->SetFocus();
				break;
			case 3:
				m_console->ShowWindow(SW_HIDE);
				m_shell->ShowWindow(SW_HIDE);
				m_file->ShowWindow(SW_SHOW);
				m_proxy->ShowWindow(SW_HIDE);
				m_screen->ShowWindow(SW_HIDE);
				m_process->ShowWindow(SW_HIDE);
				m_file->SetFocus();
				break;
			case 4:
				m_console->ShowWindow(SW_HIDE);
				m_shell->ShowWindow(SW_HIDE);
				m_file->ShowWindow(SW_HIDE);
				m_proxy->ShowWindow(SW_SHOW);
				m_screen->ShowWindow(SW_HIDE);
				m_process->ShowWindow(SW_HIDE);
				m_proxy->SetFocus();
				break;
			case 5:
				m_console->ShowWindow(SW_HIDE);
				m_shell->ShowWindow(SW_HIDE);
				m_file->ShowWindow(SW_HIDE);
				m_proxy->ShowWindow(SW_HIDE);
				m_screen->ShowWindow(SW_SHOW);
				m_process->ShowWindow(SW_HIDE);
				m_screen->SetFocus();
				break;
			}
			break;
	}

	return 0;
}

HWND CConsoleView::GetSubWnd(int nSubWnd)
{
	switch (nSubWnd)
	{
	case 0:
		return m_console->m_hWnd;
	case 1:
		return m_shell->m_hWnd;
	case 2:
		return m_process->m_hWnd;
	case 3:
		return m_file->m_hWnd;
	case 4:
		return m_proxy->m_hWnd;
	case 5:
		return m_screen->m_hWnd;
	}

	return NULL;
}

⌨️ 快捷键说明

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