免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:易道云信息技术研究院
上一个内容:92.游戏的启动与多开-多开检测概述
枚举多开检测在事前检测用的很少,在事中检测用的很多,因为实现起来很容易成本很少,然后也有很多人忽略了这一点所以在事中检测用它的很多
新建一个MFC程序
MUlCheat是一个新建的MFC程序,里面就给默认的确认按钮加了点击事件,还添加了一个检测多开的函数
MUlCheatDlg.cpp文件里面的修改
// CMUlCheatDlg 消息处理程序
BOOL CMUlCheatDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 事前检测
if (TestMulByProcess())ExitProcess(0);
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
bool CMUlCheatDlg::TestMulByProcess()
{
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
// 句柄获取失败之后的值都是-1
if (hSnap == INVALID_HANDLE_VALUE) {
return false;
}
int icount = 0;
PROCESSENTRY32 process{ sizeof(process) };
BOOL BMORE = Process32First(hSnap, &process);
while (BMORE)
{
CString txt = process.szExeFile;
if (txt.MakeLower() == "mulcheat.exe") {
icount++;
}
BMORE = Process32Next(hSnap, &process);
}
if (icount > 1) {
return true;
}
return false;
}
// 事中检测,这是确定按钮处理点击事件的函数
void CMUlCheatDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//CDialogEx::OnOK();
if (TestMulByProcess())AfxMessageBox(L"检测到多开!");
}
MUlCheatDlg.h: 文件里的内容
// MUlCheatDlg.h: 头文件
//
#pragma once
#include <TlHelp32.h>
// CMUlCheatDlg 对话框
class CMUlCheatDlg : public CDialogEx
{
// 构造
public:
CMUlCheatDlg(CWnd* pParent = nullptr); // 标准构造函数
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_MULCHEAT_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
// 检测多开的函数
bool TestMulByProcess();
public:
afx_msg void OnBnClickedOk();
};