我们的项目主要做的是植物大战僵尸的外挂 需要有三个步骤:
1.外挂界面
2.事件处理(比如点击无CD 可以免除技能的冷却时间)
3.跨进程访问(植物大战僵尸外挂和植物大战僵尸属于两个不同的进程(程序) 外挂的功能中需要跨进程访问植物大战僵尸这款软件)
1.Windows的桌面开发
C++:MFC、Qt
C#:WinForm、WPF
这边我们选择使用MFC进行桌面开发 那么就需要安装好MFC相关的组件才行
2.图标
我们可以右击对话框 选择属性 选择属性中的边框 边框选择对话框外框 这样就能实现运行之后无法拖动边框的效果了
3.按钮
注意:按钮拖动到对话框以后 不要双击 否则后续的错误很难改进 你双击的目的可能是为了修改按钮的文字 我们可以先单击他 然后修改他的属性即可
我们按钮的实现效果是点击之后会执行某些操作 显然就是要将按钮和点击事件绑定在一起
我们首先可以对重置一下该按钮的id 使其更具有可读性(具体就是单击按钮 选择属性中的ID进行修改即可) 比如我将其改成了IDC_COURSE
修改了ID以后 我们需要修改一下Resource.h(重点在于清除之前的ID 保留现在的ID)
接着我们需要设置一下点击事件(函数) 头文件和源文件(Dlg文件)都需要设置 我们取名为OnBtnClickedCourse
最后我们需要在BEGIN_MESSAGE_MAP函数中完成按钮和点击事件的绑定操作 需要两个参数 一个是按钮的ID 另一个是函数的地址值(函数名本身就是地址值 不需要&) 该绑定函数名为ON_BN_CLICKED
为了体现出我们点击按钮之后调用了按钮点击事件函数 我们可以在里面内置打印操作
但是以前的cout打印操作仅仅适用于命令提示符窗口 并不适用于MFC使用 但是MFC内置也有专门类似于printf的打印函数 该函数为TRACE 但是注意他得在debug调试模式下才可以看到打印信息
void CPVZCheaterDlg::OnBtnClickedCourse() {int age = 20;TRACE("age is %d", age);
}
除了上述的TRACE函数以外 我们还可以借助AfxMessageBox函数达到打印信息的弹窗显示 并且我们还需要知道一个点 就是MFC中不能用""表示字符串 需要通过CString来表示 如果想要表示格式化字符串的话 则需要调用CString.Format函数
可以直接非调试状态下运行 结果可以看到弹窗上显示打印信息
void CPVZCheaterDlg::OnBtnClickedCourse() {CString str;str.Format(CString("age is %d"), 20);AfxMessageBox(str);
}
除了上述这两种方法可以体现我们调用了点击事件函数以外 还可以借助MessageBox函数实现该功能 和AfxMessageBox不同的是 只能在CWnd的子类中使用 显然我们的对话框类最终继承了CWnd 而且在功能上也比AfxMessageBox多(可以定义对话框标题、内容以及按钮、图标) 同样的 也可以直接在非调试状态下运行 即可看到最终效果
void CPVZCheaterDlg::OnBtnClickedCourse() {CString str;str.Format(CString("age is %d"), 20);MessageBox(str, CString("警告"), MB_YESNOCANCEL | MB_ICONWARNING);
}
我们其实可以通过宏定义优化一下上述的三种做法 提高一下代码的复用率 避免频繁使用下代码的增加
宏定义中 我们可以使用__VA_ARGS__来代替可变参数…
由于宏定义的替换只包含了log的右边部分 如果想要包含下面的部分 那么需要通过\完成包含操作
#define log(fmt, ...) \
CString str; \
str.Format(CString(fmt), __VA_ARGS__); \
AfxMessageBox(str);
void CPVZCheaterDlg::OnBtnClickedCourse() {int age = 10;log("age is %d", age);
}