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