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

📄 cmdshell.cpp

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

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

#include "ntshell.h"
#include "cmdshell.h"

CCmdEditCtrl::CCmdEditCtrl()
{
	nCmdRecord = 0;
	nMaxCmdRecord = 100;
	history = NULL;
	slave_sock = INVALID_SOCKET;
}

CCmdEditCtrl::~CCmdEditCtrl()
{
	PRECORD_LIST temp;

	if (history != NULL)
	{
		while (history->flink != NULL)
		{
			history = history->flink;
		}

		while (history != NULL)
		{
			temp = history;
			history = history->blink;
			HeapFree(GetProcessHeap(), 0, temp);
		}

		history = NULL;
		nCmdRecord = 0;
	}
}

void CCmdEditCtrl::AddCmdRecord(char *cmd)
{
	PRECORD_LIST list, temp;
	int cmdlen;

	for (cmdlen = 0; cmd[cmdlen] && cmd[cmdlen] != 0x0a && cmd[cmdlen] != 0x0d; cmdlen++);

	if (history != NULL)
	{
		temp = history;

		while (temp->flink != NULL)				//指向链表头部
			temp = temp->flink;

		while (temp != NULL)
		{
			if (strncmp(temp->cmd, cmd, cmdlen) == 0 && temp->cmd[cmdlen] == '\0')	//查找重复记录
			{
				if (temp->flink != NULL)				//移除节点
				{
					history = temp->flink;
					temp->flink->blink = temp->blink;
				}

				if (temp->blink != NULL)
				{
					history = temp->blink;
					temp->blink->flink = temp->flink;
				}

				while (history->blink != NULL)
					history = history->blink;

				if (temp != history)
				{
					history->blink = temp;
					temp->flink = history;
					temp->blink = NULL;
					history = temp;
				}

				return;
			}

			temp = temp->blink;
		}
	}

	list = (PRECORD_LIST)HeapAlloc(GetProcessHeap(), 0, sizeof(RECORD_LIST) + cmdlen + 1);

	if (list != NULL)
	{
		strncpy(list->cmd, cmd, cmdlen);
		list->cmd[cmdlen] = '\0';

		if (nCmdRecord > nMaxCmdRecord)
		{
			temp = history;

			while (temp->flink != NULL)
				temp = temp->flink;

			temp->blink->flink = NULL;
			HeapFree(GetProcessHeap(), 0, temp);
			nCmdRecord--;
		}

		if (history == NULL)
		{
			list->flink = NULL;
			list->blink = NULL;
			history = list;
		}
		else
		{
			while (history->blink != NULL)
				history = history->blink;

			list->flink = history;
			list->blink = NULL;
			history->blink = list;
			history = list;
		}

		nCmdRecord++;
	}
}

char *CCmdEditCtrl::GetNextCmdRecord()
{
	if (history == NULL)
		return "";

	if (history->blink != NULL)
		history = history->blink;

	return history->cmd;
}

char *CCmdEditCtrl::GetPrevCmdRecord()
{
	if (history == NULL)
		return "";

	if (history->flink != NULL)
		history = history->flink;

	return history->cmd;
}

BOOL CCmdEditCtrl::PreTranslateMessage(MSG* pMsg)
{
	pMsg;
	return FALSE;
}

LRESULT CCmdEditCtrl::OnRButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
	int nStart, nEnd;

	GetSel(nStart, nEnd);

	if (nStart != nEnd)
	{/*
		if (OpenClipboard())
		{
			HANDLE hMem = GetClipboardData(CF_TEXT);

			if (hMem == NULL)
				return -1;

			char *p = (char *)GlobalLock(hMem);

			if (p == NULL)
			{
				CloseClipboard();
				return -1;
			}

			GlobalUnlock(hMem);
			CloseClipboard();
			return 0;
		}//*/
		Copy();
		SetSel(GetWindowTextLength(), GetWindowTextLength());
	}
	else
	{/*
		if (OpenClipboard())
		{
			HANDLE hMem = GetClipboardData(CF_TEXT);

			if (hMem == NULL)
				return -1;

			char *p = (char *)GlobalLock(hMem);

			if (p == NULL)
			{
				CloseClipboard();
				return -1;
			}

			AppendText(p);
			GlobalUnlock(hMem);
			CloseClipboard();
		}//*/

		if (slave_sock == INVALID_SOCKET)
		{
			MessageBox("连接不可用", "", MB_ICONERROR);
			return 0;
		}

		SetSel(GetWindowTextLength(), GetWindowTextLength());
		Paste();
	}

	return 0;
}

LRESULT CCmdEditCtrl::OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
	int nStart, nEnd;
	char *p;

	GetSel(nStart, nEnd);

	switch ((TCHAR)wParam)
	{
	case VK_UP:
		p = GetPrevCmdRecord();
		SetSel(nCmdStartPos, GetWindowTextLength());
		ReplaceSel(p);
		break;

	case VK_DOWN:
		p = GetNextCmdRecord();
		SetSel(nCmdStartPos, GetWindowTextLength());
		ReplaceSel(p);
		break;

	case VK_LEFT:
		if (nStart <= nCmdStartPos)
			break;
		bHandled = FALSE;
		break;

	case VK_RIGHT:
		bHandled = FALSE;
		break;

	case VK_DELETE:
		if (nStart < nCmdStartPos)
			break;
		bHandled = FALSE;
		break;

	default:
		bHandled = FALSE;
		break;
	}

	return 0;
}

LRESULT CCmdEditCtrl::OnChar(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
	if (slave_sock == INVALID_SOCKET)
	{
		MessageBox("连接不可用", "", MB_ICONERROR);
		return 0;
	}

	int ret, nStart, nEnd;
	char *pch;
	HLOCAL hText;
	GetSel(nStart, nEnd);

	switch ((TCHAR)wParam)
	{
	case VK_RETURN:
		AppendText("\x0d\x0a");
		hText = GetHandle();
		pch = (char *)LocalLock(hText) + nCmdStartPos;
		AddCmdRecord(pch);

		if (stricmp(pch, "cls\x0d\x0a") == 0)
		{
			nCmdStartPos = 0;
			ret = send(slave_sock, "\x0d\x0a", strlen("\x0d\x0a"), 0);
		}
		else
		{
			ret = send(slave_sock, pch, strlen(pch), 0);
		}

		LocalUnlock(hText);
		break;

	case VK_BACK:
		if (nStart <= nCmdStartPos)
			break;
		bHandled = FALSE;
		break;

	default:
		if (nStart <= nCmdStartPos)
		{
			int nTextEnd = GetWindowTextLength();
			SetSel(nTextEnd, nTextEnd);
		}
		bHandled = FALSE;
		break;
	}

	return 0;
}

LRESULT CCmdEditCtrl::OnPaste(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
	if (slave_sock == INVALID_SOCKET)
	{
		MessageBox("连接不可用", "", MB_ICONERROR);
		return 0;
	}

	if (OpenClipboard())
	{
		HANDLE hMem = GetClipboardData(CF_TEXT);

		if (hMem == NULL)
			return -1;

		char *p = (char *)GlobalLock(hMem);

		if (p == NULL)
			return -1;

		send(slave_sock, p, strlen(p), 0);

		GlobalUnlock(hMem);
		CloseClipboard();
		return 0;
	}

	return -1;
}

LRESULT CCmdEditCtrl::OnSocketRead(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
	SOCKET slave_sock = (SOCKET)wParam;
	int ret;
	char buffer[200];

	ret = recv(slave_sock, buffer, 199, 0);

	if (ret != SOCKET_ERROR)
	{
		buffer[ret] = '\0';
		SetSel(nCmdStartPos, GetWindowTextLength());
		ReplaceSel(buffer);
		nCmdStartPos = GetWindowTextLength();
	}

	return 0;
}

BOOL CCmdEditCtrl::StartCmdEditor(SOCKET sock)
{
	nCmdStartPos = 0;
	slave_sock = sock;
	LimitText(1000000);

	return TRUE;
}

⌨️ 快捷键说明

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