当前位置: 首页 > article >正文

91.游戏的启动与多开-游戏启动

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

内容参考于:易道云信息技术研究院

上一个内容:90.游戏安全项目-项目搭建与解析

以90.游戏安全项目-项目搭建与解析它的代码为基础进行修改

效果图:

首先给Dialog添加一个输入框和一个按钮

然后给输入框添加一个变量

编辑的项目:

初始化函数的代码

BOOL ChtdExeDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 将“关于...”菜单项添加到系统菜单中。

    // 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);
        }
    }
    wchar_t App[0xFF];
    GetModuleFileName(0, App, 0xFF);

    for (int i = 0xFE; i > 0; i--)
    {
        if (App[i] == L'\\') {
            App[i] = 0;
            break;
        }
    }

    txtAppPath.Format(L"%s\\", App);
    txtDllPath = txtAppPath + L"Dlls.dll";
    txtIni = txtAppPath + L"set.ini";

    wchar_t _App[0xFF];
    GetPrivateProfileString(L"game",L"path", L"", _App, 0xFF, txtIni);
    txtPath.Format(L"%s", _App);
    UpdateData(FALSE);

    for (int i = 0xFE; i > 0; i--)
    {
        if (_App[i] == L'\\') {
            _App[i] = 0;
            break;
        }
    }

    txtDic.Format(L"%s\\", _App);
    // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);            // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO: 在此添加额外的初始化代码

    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void ChtdExeDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialogEx::OnSysCommand(nID, lParam);
    }
}

启动 按钮的点击事件代码

void ChtdExeDlg::OnBnClickedOk()
{
    /**
     InjectByWndHook函数是窗口注入:
      Sword2 Window是从Spy++里得到,这是窗口的名字(标题)
      Sword2 Class是从Spy++里得到,这时窗口的类
      dlls.dll是dlls项目中编译出来的dll文件
    */
    //htd::INJECT::InjectByWndHook(L"Sword2 Window", L"Sword2 Class",L"dlls.dll");

    /**
    * InjectByEntry函数是入口点注入
    *    第一个参数是游戏可执行文件的目录
    *    第二个是游戏目录
    *    第三个是启动游戏的命令行参数
    *    第四个是外挂模块的目录
    */
    htd::INJECT::InjectByEntry(txtPath,
        txtAppPath,
        L"",
        txtDllPath);


    // TODO: 在此添加控件通知处理程序代码
    //CDialogEx::OnOK();
    /*htd::INJECT::InjectByEntry(L"F:\\Games\\JX2\\Sword2WindowsA7.exe",
        L"F:\\Games\\JX2\\", 
        L"", 
        L"F:\\Program Design\\课程代码\\htd\\Release\\htdMfcDll.dll");
    */

    //htd::INJECT::InjectByWndHook(L"Sword2 Window",L"Sword2 Class",L"F:\\Program Design\\课程代码\\htd\\Release\\htdMfcDll.dll");
}

叫 ... 按钮的点击事件代码


void ChtdExeDlg::OnBnClickedButton1()
{
    // 配置游戏路径
    TCHAR szFilter[] = _T("exe (*.exe)|*.exe|dat (*.dat)|*.dat|所有文件(*.*)|*.*||");
    CFileDialog dialog(TRUE, NULL, NULL, 6, szFilter);
    if (dialog.DoModal() == IDOK) {
        txtPath = dialog.GetPathName();
        txtDic = dialog.GetFolderPath() + L"\\";
        WritePrivateProfileString(L"game", L"path", txtPath.GetBuffer(), txtIni.GetBuffer());
        UpdateData(FALSE);
    }
}

htdExeDlg.h文件里的内容


// htdExeDlg.h: 头文件
//

#pragma once


// ChtdExeDlg 对话框
class ChtdExeDlg : public CDialogEx
{
// 构造
public:
    ChtdExeDlg(CWnd* pParent = nullptr);    // 标准构造函数

// 对话框数据
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_HTDEXE_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()
public:
    afx_msg void OnBnClickedOk();
    afx_msg void OnBnClickedButton1();
    afx_msg void OnBnClickedCancel();
    CString txtPath;
    CString txtDic;
    CString txtAppPath;
    CString txtDllPath;
    CString txtIni;

};


http://www.kler.cn/a/283434.html

相关文章:

  • 除了 Postman,还有什么好用的 API 调试工具吗
  • 灰狼优化算法
  • MySQL中的事务与锁
  • java双向链表解析实现双向链表的创建含代码
  • 2024HNCPC G - Utakotoba
  • ssd作为hdd缓存加速方案
  • Live800:以客户为中心,构建全方位客户服务策略
  • ThinkPHP之入门讲解
  • C++(this指针/常函数与常对象/拷贝构造函数/赋值函数/静态成员/静态成员函数/单列模式)
  • pdf、mp4、zip、rar、jpg等文件被大量访问造成流量超标解决方案
  • 腾讯提出一种新的针对风格化角色和逼真服装动画的生成3D运动转移方法,生成效果逼真!
  • Excel中使用VBS自定义函数将中文转为拼音首字母
  • MySQL内部临时表(Using temporary)案例详解及优化解决方法
  • 快速了解FlashInfer
  • [CTF]-Reverse:Reverse做题笔记
  • defineProps、defineEmits、 defineExpose的TS写法
  • python os获取当前git目录的git用户
  • python------python解释器,pycharm下载配置
  • jmespath用法总结
  • 如何用GPT进行编程辅助?
  • MM 2024 Oral: 大模型带你鉴赏世界名画!同济大学发布
  • 202408830配置WIN11自带的画图程序的画布为4K分辨率
  • 探索 HarmonyOS 中的高级文本自定义
  • Python自动化测试requests库深度详解
  • 实战OpenCV之绘制图形
  • [000-01-015].第03节:SpringBoot中数据源的自动配置