MFC中 初学钩子 遇到一个问题

IT保安 2014-09-10 08:44:01
代码如下:这是写在dll文件中的
LRESULT CALLBACK myProc( int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if(wParam == VK_HOME)
{AfxMessageBox("钩子成功安装!");}
return CallNextHookEx(0,code,wParam,lParam);
}

//SetWindowsHookEx

void SetHook()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HWND Hwnd = FindWindow(NULL,"MyTest");
// if(Hwnd==NULL)AfxMessageBox("MyTest句柄失败!");
DWORD gid;
::GetWindowThreadProcessId(Hwnd,&gid);
// if(gid==NULL)AfxMessageBox("线程ID失败!");
::SetWindowsHookEx(WH_KEYBOARD,myProc,GetModuleHandle("GameHook.dll"),gid);
}

这是写在exe文件中的,调用函数
__declspec(dllimport) void SetHook();

#pragma Comment(lib,"GameHook.lib");
void CHookTextDlg::OnHook()
{
// TODO: Add your control notification handler code here
SetHook();

}


我遇到的问题,很奇怪,自己搞不懂!因为我是对照着视频一步步做的,和视频的结果不一样!
在void SetHook()这个函数中,我注释了两个if语句,如果不注释这两个if,先运行本程序,然后再运行目标程序,那么在目标文件上面我按下home键就会正常弹出对话框!依次弹出用("MyTest句柄失败!");
("线程ID失败!");
("钩子成功安装!"),我用软件来查看,也能看到dll已经注入了目标程序中!而且必须按照这个顺序,否则也不能成功运行!
但是,如果注释掉这两个if,那么无论如何程序都没有用了,不管是先运行目标程序,还是先运行本程序,都不会弹出("钩子成功安装!")这个对话框了!
盼解答!
...全文
90 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-09-11
  • 打赏
  • 举报
回复
学习WinDbg吧,骚年!

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧