免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:易道云信息技术研究院
上一个内容:57.获取进程列表
以 57.获取进程列表 它的代码为基础进行修改
效果图:
首先添加一个tab控件
然后给tab控件添加一个变量
tab控件的属性
然后新创建一个Dialog,并给它拖入一个List控件
dialog的属性
然后给新加的Dialog添加类,list控件添加变量
CWndINC.h文件内容:
#pragma once
#include "CWindProcess.h"
#include "CWndModuleList.h"
#define MAX_PAGE 2
// CWndINC 对话框
class CWndINC : public CDialogEx
{
DECLARE_DYNAMIC(CWndINC)
public:
CWndINC(CWnd* pParent = nullptr); // 标准构造函数
virtual ~CWndINC();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_PAGE_1 };
#endif
protected:
virtual BOOL OnInitDialog();
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
CWindProcess wndProcess;
CString UExe;
CString UExeRoot;
CTabCtrl mTab;
CWndModuleList modPage[MAX_PAGE];
CDialogEx* Pages[MAX_PAGE];
int CurPage{};
public:
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedButton2();
void SetProcess(unsigned Pid, CString& wExe, BOOL bFirst = FALSE);
bool InstallPage(CDialogEx* wnd, int IDD_WND, CString&& _Name, BOOL IsShow);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult);
};
CWndINC.cpp文件的修改:
// 下方是修改了的函数
BOOL CWndINC::OnInitDialog()
{
CDialogEx::OnInitDialog();
InstallPage(&modPage[0], IDD_MOD_LIST, L"正常进程", TRUE);
InstallPage(&modPage[1], IDD_MOD_LIST, L"感染进程", TRUE);
return 0;
}
// 下方是新加的函数
bool CWndINC::InstallPage(CDialogEx* wnd, int IDD_WND, CString&& _Name, BOOL IsShow)
{
if (CurPage > MAX_PAGE) {
return false;
}
Pages[CurPage] = wnd;
Pages[CurPage]->Create(IDD_WND, &mTab);
//Pages[CurPage]->SetParent(this);
Pages[CurPage]->ShowWindow(IsShow);
CRect rect;
mTab.GetClientRect(&rect);
rect.top += 0;
rect.left += 5;
rect.bottom -= 25;
rect.right += 0;
Pages[CurPage]->MoveWindow(&rect);
mTab.InsertItem(CurPage, _Name);
CurPage++;
return true;
}
void CWndINC::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
CDialogEx::OnSize(nType, cx, cy);
if (nType == 1 || !mTab)return;
CRect rect;
GetClientRect(&rect);
rect.top += 00;
rect.left += 0;
rect.bottom -= 130;
rect.right += 0;
for (int i = 0; i < CurPage; i++) {
if (Pages[i]) {
Pages[i]->MoveWindow(&rect);
}
}
}
void CWndINC::OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
// 得到当前选择的tab
int n = mTab.GetCurSel();
for (int i = 0; i < CurPage; i++) {
Pages[i]->ShowWindow(i == n);
}
}
CWndModuleList.cpp文件里的内容:CWndModuleList.cpp是新加Dialogd的类
// CWndModuleList.cpp: 实现文件
//
#include "pch.h"
#include "GAMEHACKER2.h"
#include "CWndModuleList.h"
#include "afxdialogex.h"
// CWndModuleList 对话框
IMPLEMENT_DYNAMIC(CWndModuleList, CDialogEx)
CWndModuleList::CWndModuleList(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_MOD_LIST, pParent)
{
}
CWndModuleList::~CWndModuleList()
{
}
void CWndModuleList::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, LstModule);
}
BOOL CWndModuleList::OnInitDialog()
{
CDialogEx::OnInitDialog();
LONG_PTR lStyle;
// 得到窗口的样式,GWL_STYLE在GetWindowLongPtr说明中有
lStyle = GetWindowLongPtr(LstModule.m_hWnd, GWL_STYLE);
lStyle |= LVS_REPORT;
SetWindowLongPtr(LstModule.m_hWnd, GWL_STYLE, lStyle);
DWORD dStyle = LstModule.GetExtendedStyle();
dStyle |= LVS_EX_FULLROWSELECT;
dStyle |= LVS_EX_GRIDLINES;
LstModule.SetExtendedStyle(dStyle);
LstModule.InsertColumn(0, L"模块名称", 0, 200);
LstModule.InsertColumn(1, L"基址", 0, 400);
LstModule.InsertColumn(2, L"大小", 0, 400);
LstModule.InsertColumn(3, L"文件位置", 0, 400);
return TRUE;
}
BEGIN_MESSAGE_MAP(CWndModuleList, CDialogEx)
END_MESSAGE_MAP()
// CWndModuleList 消息处理程序
CWndModuleList.h文件内容:CWndModuleList.h是新加Dialogd的类
#pragma once
// CWndModuleList 对话框
class CWndModuleList : public CDialogEx
{
DECLARE_DYNAMIC(CWndModuleList)
public:
CWndModuleList(CWnd* pParent = nullptr); // 标准构造函数
virtual ~CWndModuleList();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_MOD_LIST };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
CListCtrl LstModule;
public:
virtual BOOL OnInitDialog();
};