📄 cmdshell.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 + -