菜鸟的VC6神迹外挂的DIY之路(二)

上次我们已经从游戏程序的内部显示了一个消息框出来了
但还不够,我们要在游戏能够呼出外挂的界面,至少要显示一个对话框出来

下面我们在S3DHook这个DLL工程中添加一个从CDialog派生的CS3DHookDlg类

把DIALOG ID改为IDD_S3DHOOK_DIALOG

添加的对话框类的操作如下
主菜单->Insert->New Form

为了方便,把CS3DHookDlg的源程序文件名字分别改为
s3dhook.h
s3dhook.cpp

操作:点上图中的Chang

把刚才自动生成的对话框的Caption改为"外挂呼出窗口"

下面定义一个全局窗口指针来保存我们要生成的这个窗口的指针,以便后面对"外挂呼出窗口"进行控制,把它和全局变量
CS3DHookApp theApp;
写在一起,也就是这个样子
CS3DHookApp theApp;
CS3DHookDlg *pCWndWGMain;
下面对钩子回调函数进行改造,以便使我们的"外挂呼出窗口"能够在按F12时呼出
如下:
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
//按F12弹起时呼出外挂
BOOL bKeyUp = lParam & (1 << 31);
if (bKeyUp && wParam == VK_F12 && nCode == HC_ACTION) {
if (pCWndWGMain == NULL) 
{
//更改当前有效模块状态到DLL中
//以便正确的读取对话框的资源
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//找到当前的有效激活窗口
CWnd *pCWnd = CWnd::GetForegroundWindow();
//生成CS3DHookDlg类的对象实例
//此处应该生成一个非模态对话框
pCWndWGMain = new CS3DHookDlg();
pCWndWGMain->Create(IDD_S3DHOOK_DIALOG, pCWnd);
}
else 
{
//根据当前呼出窗口的状态来显示或隐藏呼出窗口
pCWndWGMain->ShowWindow(pCWndWGMain->IsWindowVisible() ? SW_HIDE : SW_SHOW);
}
}
return ::CallNextHookEx(g_hhook, nCode, wParam ,lParam);
}
有关上面的这一句
在Regular MFC DLL中使用资源时非常重要
AFX_MANAGE_STATE(AfxGetStaticModuleState());
更多说明请参看
这里
当关掉外挂的主程序时,还要做点善后工作
重载CS3DHookApp类的ExitInstance函数,在其中删除对话框
int CS3DHookApp::ExitInstance() 
{
// TODO: Add your specialized code here and/or call the base class
delete pCWndWGMain;
return CWinApp::ExitInstance();
}
重新编译生成S3DHOOK.dll并和Main.exe放到一起,运行它试试看

运行后,随便打开一个其他的什么窗口,按F12,看到什么了?

哈哈,我们的"外挂呼出窗口"呼出来了,真是千呼万唤始出来啊

我在记事本中试了试:

转载于:https://www.cnblogs.com/fishxz/archive/2007/01/30/635045.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值