一、说明

前面几篇,已经将所有基本的工具函数写完,这一篇,主要是将所有的功能串起来,使界面和功能进行交互。

二、初始化

2.1 初始化两个listctrl

  1. 查找的list控件只需要一栏,显示地址就可以了
  2. 目标list控件需要四栏,分别为说明、地址、类型、值,其中说明可以不考虑

将这两个函数在OnInitDialog中调用

2.2 初始化搜索和编辑设置

将这两个函数在OnInitDialog中调用

2.3 回调函数

三、搜索

3.1 首次搜索

双击首次搜索按钮,在生成的函数中加入以下代码:
逻辑很简单

  1. 获取进程id
  2. 获取界面参数(搜索值、范围、类型)
  3. 按照类型查找
  4. 查完遍历结果显示到listctrl控件上
  5. 清零进度条
void CModifierDlg::OnBnClickedButtonFirst()
{// TODO: 在此添加控件通知处理程序代码if (m_dwProcessId == 0) {AfxMessageBox(_T("请选择进程!"));OnBnClickedButtonProgress();  // 若未选择进程,则打开进程列表}if (m_dwProcessId == 0) {AfxMessageBox(_T("用户未选择进程!"));return;}m_bGoon = true;       // 开启回调m_listAddressTemp.DeleteAllItems();//UpdateData(TRUE);// 获取界面参数CString valueTemp;GetDlgItemText(IDC_EDIT_SEARCH_VALUE, valueTemp);if (valueTemp.IsEmpty()) {AfxMessageBox(_T("请输入搜索的值"));return;}CString start, end;GetDlgItemText(IDC_EDIT_LIMIT_START, start);GetDlgItemText(IDC_EDIT_LIMIT_END, end);_TCHAR* szEnd = NULL;DWORD dwLimitBegin = _tcstol(start.GetString(), &szEnd, 0x10);DWORD dwLimitEnd = _tcstol(end.GetString(), &szEnd, 0x10);GetDlgItem(IDC_BUTTON_FIRST)->EnableWindow(FALSE); // 使首次搜索按钮失效// 根据选择的不同数据类型,进行不同方式的查找int iIdx = m_comboxValueType.GetCurSel();bool bFind = false;switch (iIdx) {case 0: { // 1字节TCHAR* szEndPtr = nullptr;unsigned long ul = _tcstoul(valueTemp.GetString(), &szEndPtr, 10);BYTE bb = (BYTE)(ul & 0x000000FF);bFind = m_pFinder->FindFirstEx(m_dwProcessId, dwLimitBegin, dwLimitEnd, bb);break;}case 1: { // 2字节TCHAR* szEndPtr = nullptr;unsigned long ul = _tcstoul(valueTemp.GetString(), &szEndPtr, 10);SHORT bb = (SHORT)(ul & 0x0000FFFF);bFind = m_pFinder->FindFirstEx(m_dwProcessId, dwLimitBegin, dwLimitEnd, bb);break;}case 2: { // 4字节TCHAR* szEndPtr = nullptr;unsigned long ul = _tcstoul(valueTemp.GetString(), &szEndPtr, 10);DWORD bb = (DWORD)(ul & 0xFFFFFFFF);bFind = m_pFinder->FindFirstEx(m_dwProcessId, dwLimitBegin, dwLimitEnd, bb);break;}case 3: { // floatTCHAR* szEndPtr = nullptr;float f = _tcstof(valueTemp.GetString(), &szEndPtr);bFind = m_pFinder->FindFirstEx(m_dwProcessId, dwLimitBegin, dwLimitEnd, f);break;}case 4: { // doubleTCHAR* szEndPtr = nullptr;double d = _tcstod(valueTemp.GetString(), &szEndPtr);bFind = m_pFinder->FindFirstEx(m_dwProcessId, dwLimitBegin, dwLimitEnd, d);break;}default:break;}if (!bFind) {// 恢复按钮 可用状态GetDlgItem(IDC_BUTTON_FIRST)->EnableWindow(TRUE);// 继续搜索标置(false)m_bGoon = false;UpdateData(FALSE);return;}const std::list<DWORD>& lst = m_pFinder->GetResults();int index = 1024; //最多显示1024结果for (auto addr : lst) {if (index-- <= 0) {break;}int index = m_listAddressTemp.InsertItem(0, _T(""));CString s;s.Format(_T("%08X"), addr);m_listAddressTemp.SetItemText(index, 0, s);}// 进度条清0m_pProgress.SetPos(0);// 恢复按钮 可用状态GetDlgItem(IDC_BUTTON_FIRST)->EnableWindow(TRUE);// 继续搜索标置(false)m_bGoon = false;//UpdateData(FALSE);return;
}

3.2 再次搜索

双击再次搜索按钮,在生成的函数中加入以下代码
逻辑和首次搜索基本一致

  1. 由于进程id和搜索类型和首次搜索必然一致,所以这两个参数不用再获取和传递
  2. 由于搜索范围必然是在首次搜索的结果上进一步搜索,所以搜索范围这个参数不用再获取
  3. 将findfirst换成findnext即可
void CModifierDlg::OnBnClickedButtonNext()
{// TODO: 在此添加控件通知处理程序代码m_bGoon = true;// 目标值CString valueTemp;GetDlgItemText(IDC_EDIT_SEARCH_VALUE, valueTemp);if (valueTemp.IsEmpty()) {AfxMessageBox(_T("请输入目标值"));UpdateData(FALSE);m_bGoon = false;return;}GetDlgItem(IDC_BUTTON_NEXT)->EnableWindow(FALSE);m_listAddressTemp.DeleteAllItems();int iIdx = m_comboxValueType.GetCurSel();bool bFind = false;switch (iIdx) {case 0: { // 1字节TCHAR* szEndPtr = nullptr;unsigned long ul = _tcstoul(valueTemp.GetString(), &szEndPtr, 10);BYTE bb = (BYTE)(ul & 0x000000FF);bFind = m_pFinder->FindNextEx(bb);break;}case 1: { // 2字节TCHAR* szEndPtr = nullptr;unsigned long ul = _tcstoul(valueTemp.GetString(), &szEndPtr, 10);SHORT bb = (SHORT)(ul & 0x0000FFFF);bFind = m_pFinder->FindNextEx(bb);break;}case 2: { // 4字节TCHAR* szEndPtr = nullptr;unsigned long ul = _tcstoul(valueTemp.GetString(), &szEndPtr, 10);DWORD bb = (DWORD)(ul & 0xFFFFFFFF);bFind = m_pFinder->FindNextEx(bb);break;}case 3: { // floatTCHAR* szEndPtr = nullptr;float f = _tcstof(valueTemp.GetString(), &szEndPtr);bFind = m_pFinder->FindNextEx(f);break;}case 4: { // doubleTCHAR* szEndPtr = nullptr;double d = _tcstod(valueTemp.GetString(), &szEndPtr);bFind = m_pFinder->FindNextEx(d);break;}default:break;}if (!bFind) {// 恢复按钮 可用状态GetDlgItem(IDC_BUTTON_NEXT)->EnableWindow(TRUE);// 继续搜索标置(false)m_bGoon = false;UpdateData(FALSE);return;}const std::list<DWORD>& lst = m_pFinder->GetResults();int index = 1024; //最多显示1024结果for (auto addr : lst) {if (index-- <= 0) {break;}int index = m_listAddressTemp.InsertItem(0, _T(""));CString s;s.Format(_T("%08X"), addr);m_listAddressTemp.SetItemText(index, 0, s);}// 进度条清0m_pProgress.SetPos(0);// 恢复按钮 可用状态GetDlgItem(IDC_BUTTON_NEXT)->EnableWindow(TRUE);m_bGoon = false;UpdateData(FALSE);
}

3.3 停止搜索

双击停止搜索按钮,加入以下代码

以首次搜索为例:
由于m_bGoon被作为一个回调的变量,此变量一旦为false,则回调函数返回false,则搜索直接结束

四、listctrl控件点击操作

右键添加事件处理程序

在生成的函数中加入以下代码:

以上的代码逻辑很简单:
第一个listctrl双击选中的地址,应在第二个listctrl控件上显示该地址的值以及类型等其他信息
第二个listctrl双击应在软件的右侧修改参数这里,将值、类型、地址显示到edit控件上

五、修改参数

双击修改参数按钮

六、最后

好了,到这里基本功能就写完了,
使用该程序可以修改任意的本地程序的数值类型的参数
比如某游戏的阳光数目,通信程序发送的数据量,某游戏的命数

C++ + MFC 写一个程序参数修改器(五、界面交互)相关推荐

  1. 采用FFMPEG开源库和vs2008 mfc 写一个H264播放器(1)

    /*    FFMPEG动态库使用  */ 1 将一下文件拷入工程当前目录下面 http://pan.baidu.com/disk/home#dir/path=%2FFFMPEG 2 设置项目属性 1 ...

  2. 写一个MP3播放器(vuejs+nodejs+mongodb)

    写一个MP3播放器(vue-cli+element ui+express+mongoose) 最近刚学完vuejs,为了增进理解就写了个MP3播放器(用到了vuex,vue-router,es6).可 ...

  3. 为英雄无敌3写个游戏修改器

    我是比较铁杆的英雄无敌3的fans,在网上看到这样的文章:http://game.china.com/zh_cn/play/10002765/20021113/11362720.html 就是让我方英 ...

  4. 用 Go 手写一个 JSON 序列化器

    用 Go 手写一个 JSON 序列化器 方案 实现 字符串转义 忽略类型 序列化器主体 数字和逻辑类型 字符串类型 数组类型 字典类型 自定义结构类型 指针类型 API 使用 安装 调用 测试 开源和 ...

  5. 怎样写一个拼写检查器-贝叶斯-python

    怎样写一个拼写检查器 Peter Norvig 翻译: Eric You XU 原版:http://norvig.com/spell-correct.html 翻译:http://blog.youxu ...

  6. 【ZT】怎样写一个拼写检查器

    这篇真的写的很棒,用心领会吧! 怎样写一个拼写检查器 Peter Norvig 翻译: Eric You XU 上个星期, 我的两个朋友 Dean 和 Bill 分别告诉我说他们对 Google 的快 ...

  7. 如何写一个拼写检查器—Peter Norvig 中文翻译:徐宥

    [转]如何写一个拼写检查器 本文原著:Peter Norvig  中文翻译:徐宥 上个星期, 我的两个朋友 Dean 和 Bill 分别告诉我说他们对 Google 的快速高质量的拼写检查工具感到惊奇 ...

  8. 怎样写一个拼写检查器

     怎样写一个拼写检查器 Peter Norvig 翻译: Eric You XU link:http://blog.youxu.info/spell-correct.html 上个星期, 我的两个 ...

  9. 用C++写一个文件分割器

    在成功将 mac 由 10.10 升级到 10.12 后,我发现除了新增一个并不怎么好用的 Siri 外,原来支持 NTFS 硬盘的驱动居然也成功失效了.我那块 500 GB 的东芝硬盘,虽不至于成砖 ...

最新文章

  1. 【Cocos2d-x】开发实战-Cocos中的字符串、标签和中文乱码
  2. 猫头鹰的深夜翻译:你需要了解的数据库名词
  3. Geomesa-Hbase单机部署及ingest、export shp文件数据
  4. VC程序中运行其他程序的三种方法
  5. linux树莓派扩容,树莓派ubuntu 扩容
  6. typecho一个简洁轻量适合写作,技术类的主题-AirCloud
  7. video标签播放视频
  8. 9招让你皮肤迅速白嫩 - 健康程序员,至尚生活!
  9. 三农数据(1996-2020)五:农产品产量、就业人数、农村养老等
  10. hadoop版本和java版本不一致的问题
  11. DNS是什么意思?什么是DNS服务器?(中科三方)
  12. python--爬虫51job(3.1)
  13. CF134C Swaps 题解
  14. ue4掉落深渊返回地面
  15. iOS快速清除全部的消息推送
  16. AI云时代大幕开启,华为全栈AI产品线将迎春天
  17. 在U盘上安装debian linux
  18. 显示技术介绍(1)_概述
  19. api接口文档编辑工具-YApi安装部署(window版)
  20. 蓝奏云网盘无法访问解决方法

热门文章

  1. springboot + vue 导出word 试卷
  2. 宅家36天咸鱼翻身入职腾讯,好文推荐
  3. 第一篇博文——我的第一枚脚印
  4. MAXPLUS教程 - 第2章CPLD和FPGA
  5. 黑盒测试设计专题:Pairwise配对测试
  6. 本周大新闻|传Meta与Magic Leap谈专利授权;PS VR2前6周出货60万台
  7. 推荐,对BLOGER的重要性
  8. 后端服务的雪崩效应及解决思路
  9. go每日新闻(2021-05-21)——细谈Go变量的内存分布
  10. 数据结构(C语言版)实验一 线性表