C++ + MFC 写一个程序参数修改器(五、界面交互)
一、说明
前面几篇,已经将所有基本的工具函数写完,这一篇,主要是将所有的功能串起来,使界面和功能进行交互。
二、初始化
2.1 初始化两个listctrl
- 查找的list控件只需要一栏,显示地址就可以了
- 目标list控件需要四栏,分别为说明、地址、类型、值,其中说明可以不考虑
将这两个函数在OnInitDialog中调用
2.2 初始化搜索和编辑设置
将这两个函数在OnInitDialog中调用
2.3 回调函数
三、搜索
3.1 首次搜索
双击首次搜索按钮,在生成的函数中加入以下代码:
逻辑很简单
- 获取进程id
- 获取界面参数(搜索值、范围、类型)
- 按照类型查找
- 查完遍历结果显示到listctrl控件上
- 清零进度条
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 再次搜索
双击再次搜索按钮,在生成的函数中加入以下代码
逻辑和首次搜索基本一致
- 由于进程id和搜索类型和首次搜索必然一致,所以这两个参数不用再获取和传递
- 由于搜索范围必然是在首次搜索的结果上进一步搜索,所以搜索范围这个参数不用再获取
- 将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 写一个程序参数修改器(五、界面交互)相关推荐
- 采用FFMPEG开源库和vs2008 mfc 写一个H264播放器(1)
/* FFMPEG动态库使用 */ 1 将一下文件拷入工程当前目录下面 http://pan.baidu.com/disk/home#dir/path=%2FFFMPEG 2 设置项目属性 1 ...
- 写一个MP3播放器(vuejs+nodejs+mongodb)
写一个MP3播放器(vue-cli+element ui+express+mongoose) 最近刚学完vuejs,为了增进理解就写了个MP3播放器(用到了vuex,vue-router,es6).可 ...
- 为英雄无敌3写个游戏修改器
我是比较铁杆的英雄无敌3的fans,在网上看到这样的文章:http://game.china.com/zh_cn/play/10002765/20021113/11362720.html 就是让我方英 ...
- 用 Go 手写一个 JSON 序列化器
用 Go 手写一个 JSON 序列化器 方案 实现 字符串转义 忽略类型 序列化器主体 数字和逻辑类型 字符串类型 数组类型 字典类型 自定义结构类型 指针类型 API 使用 安装 调用 测试 开源和 ...
- 怎样写一个拼写检查器-贝叶斯-python
怎样写一个拼写检查器 Peter Norvig 翻译: Eric You XU 原版:http://norvig.com/spell-correct.html 翻译:http://blog.youxu ...
- 【ZT】怎样写一个拼写检查器
这篇真的写的很棒,用心领会吧! 怎样写一个拼写检查器 Peter Norvig 翻译: Eric You XU 上个星期, 我的两个朋友 Dean 和 Bill 分别告诉我说他们对 Google 的快 ...
- 如何写一个拼写检查器—Peter Norvig 中文翻译:徐宥
[转]如何写一个拼写检查器 本文原著:Peter Norvig 中文翻译:徐宥 上个星期, 我的两个朋友 Dean 和 Bill 分别告诉我说他们对 Google 的快速高质量的拼写检查工具感到惊奇 ...
- 怎样写一个拼写检查器
怎样写一个拼写检查器 Peter Norvig 翻译: Eric You XU link:http://blog.youxu.info/spell-correct.html 上个星期, 我的两个 ...
- 用C++写一个文件分割器
在成功将 mac 由 10.10 升级到 10.12 后,我发现除了新增一个并不怎么好用的 Siri 外,原来支持 NTFS 硬盘的驱动居然也成功失效了.我那块 500 GB 的东芝硬盘,虽不至于成砖 ...
最新文章
- 【Cocos2d-x】开发实战-Cocos中的字符串、标签和中文乱码
- 猫头鹰的深夜翻译:你需要了解的数据库名词
- Geomesa-Hbase单机部署及ingest、export shp文件数据
- VC程序中运行其他程序的三种方法
- linux树莓派扩容,树莓派ubuntu 扩容
- typecho一个简洁轻量适合写作,技术类的主题-AirCloud
- video标签播放视频
- 9招让你皮肤迅速白嫩 - 健康程序员,至尚生活!
- 三农数据(1996-2020)五:农产品产量、就业人数、农村养老等
- hadoop版本和java版本不一致的问题
- DNS是什么意思?什么是DNS服务器?(中科三方)
- python--爬虫51job(3.1)
- CF134C Swaps 题解
- ue4掉落深渊返回地面
- iOS快速清除全部的消息推送
- AI云时代大幕开启,华为全栈AI产品线将迎春天
- 在U盘上安装debian linux
- 显示技术介绍(1)_概述
- api接口文档编辑工具-YApi安装部署(window版)
- 蓝奏云网盘无法访问解决方法