上次我们已经从游戏程序的内部显示了一个消息框出来了
但还不够,我们要在游戏能够呼出外挂的界面,至少要显示一个对话框出来
下面我们在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,看到什么了?
哈哈,我们的"外挂呼出窗口"呼出来了,真是千呼万唤始出来啊
我在记事本中试了试:
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pzhccy/archive/2007/08/19/1750416.aspx