看流星社区

 找回密码
 注册账号
查看: 4302|回复: 3

注入后如何获取游戏窗口的句柄,求指点?

[复制链接]

该用户从未签到

发表于 2011-3-20 09:07:02 | 显示全部楼层 |阅读模式
注入后,在游戏窗口内呼出DLL主窗口,那么接下去该如何获取DLL所在窗口的游戏窗口句柄呢。

如上图:枚举游戏进程,加入到列表框里,点击注入后,如何在游戏里呼出DLL,怎么取窗口句柄,进程ID。
               上图我已经取了进程ID,有没有办法直接把这个进程ID直接传送给对应的DLL呢。

另外还想请教下,比如我开了两个游戏窗口,开了辅助,只有两个进程,后来又开了一个,就需要刷新进程。那样刷出来三个进程把上面两个也覆盖掉了。怎么样进行过滤,相同的就不添加了,只能不同的进程ID增加进去。

该用户从未签到

发表于 2011-3-20 09:07:17 | 显示全部楼层
取进程主窗口(-1)

取所有的游戏进程ID与列表框的做比较多则删除,少则添加

该用户从未签到

发表于 2011-3-20 09:07:55 | 显示全部楼层
遍历所有的窗口句柄.如果PID=自己的PID 那么该句柄就是主窗口的.保存就行了.DLL自己的PID用 GetCurrentProcessId 取得.

列表那个你自己添加下过滤就行了.很简单的.不多说了.

该用户从未签到

发表于 2011-3-20 09:08:35 | 显示全部楼层
你确实得先把dll的句柄给过滤掉,其实做个简单的判断就行了,我下面只能给出C++代码,不过相关的函数你应该能用得到

  1. BOOL CALLBACK YourEnumProc(HWND hWnd,LPARAM lParam)
  2. {
  3. DWORD dwProcessId;
  4. GetWindowThreadProcessId(hWnd,&dwProcessId);
  5. LPWNDINFO pInfo=(LPWNDINFO)lParam;
  6. if((dwProcessId==pInfo->dwProcessId)&&(hWnd!=pInfo->Dll_hwnd))
  7. //确认找到的句柄不是DLL窗口的句柄
  8. //假如找到的是DLL窗口的句柄则返回FALSE以便继续查找宿主的窗口句柄
  9. {
  10.   pInfo->hWnd=hWnd;
  11.   return FALSE;
  12. }
  13. return TRUE;
  14. }
  15. HWND GetProcessMainWnd(DWORD dwProcessId,HWND Dll_hwnd)
  16. //将DLL窗口的句柄传入,以便识别找到的句柄不是DLL窗口的句柄
  17. {
  18. WNDINFO wi;
  19. wi.dwProcessId=dwProcessId;
  20. wi.hWnd=NULL;
  21. wi.Dll_hwnd=Dll_hwnd;
  22. EnumWindows(YourEnumProc,(LPARAM)&wi);
  23. HWND re_hwnd=wi.hWnd;
  24. while(GetParent(re_hwnd)!=NULL)
  25. //循环查找父窗口,以便保证返回的句柄是最顶层的窗口句柄
  26. {
  27.   re_hwnd=GetParent(re_hwnd);
  28. }
  29. return re_hwnd;
  30. }

复制代码
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-25 19:03

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表