近期在做一个小玩意,主要目的是想学习一下HOOK技术,想捕获腾讯QQ弹出下线通知对话框这一操作系统事件,先谈谈我已经完成的部分:安装一个全局HOOK ,监视操作系统的所有线程,该部分写成.dll文件,代码如下:
C/C++ code
#include <tchar.h>
#include "windows.h"
#include "process.h"//share data segment#pragma data_seg("sharedata")HHOOK g_hHook=NULL;
HINSTANCE g_hInstance=NULL;#pragma data_seg()#pragma comment(linker,"/SECTION:sharedata,RWS")BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if(ul_reason_for_call == DLL_PROCESS_ATTACH)
{
g_hInstance=(HINSTANCE)hModule;
}
return TRUE;
}LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
CWPSTRUCT *pCWP=(CWPSTRUCT*)lParam;
if(pCWP->message==WM_CREATE) //新窗口的创建消息
{
HWND hwnd=pCWP->hwnd;
TCHAR szText[255];
GetWindowText(hwnd,szText,250); // <----------------------------问题所在
if(szText=="下线通知") //是腾讯QQ的下线通知窗口
{
//处理操作
}
}
return CallNextHookEx(g_hHook,nCode,wParam,lParam);
}extern "C"
__declspec(dllexport) DWORD StartHook()
{
DWORD dwSet=0;
g_hHook=SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,g_hInstance,0);
if(g_hHook==NULL)
{
dwSet=GetLastError();
}
return dwSet;
}extern "C"
__declspec(dllexport) DWORD StopHook()
{
if(UnhookWindowsHookEx(g_hHook))
{
return 0;
}
else
{
return GetLastError();
}
}
遇到的问题是:我用进程管理查看发现该dll文件已经注入到了QQ的进程当中,但是功能并未实现,原因是在调用GetWindowText()函数时会再次调用目标窗口的窗口过程,于是CallWndProc()再次被调用,就形成了一个循环,有新窗口的产生执行到GetWindowText()马上回到了CallWndProc(),而没法执行到我的处理操作.有没有更好的办法判断窗口是否是腾讯QQ的下线通知窗口?
C/C++ code
#include <tchar.h>
#include "windows.h"
#include "process.h"//share data segment#pragma data_seg("sharedata")HHOOK g_hHook=NULL;
HINSTANCE g_hInstance=NULL;#pragma data_seg()#pragma comment(linker,"/SECTION:sharedata,RWS")BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if(ul_reason_for_call == DLL_PROCESS_ATTACH)
{
g_hInstance=(HINSTANCE)hModule;
}
return TRUE;
}LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
CWPSTRUCT *pCWP=(CWPSTRUCT*)lParam;
if(pCWP->message==WM_CREATE) //新窗口的创建消息
{
HWND hwnd=pCWP->hwnd;
TCHAR szText[255];
GetWindowText(hwnd,szText,250); // <----------------------------问题所在
if(szText=="下线通知") //是腾讯QQ的下线通知窗口
{
//处理操作
}
}
return CallNextHookEx(g_hHook,nCode,wParam,lParam);
}extern "C"
__declspec(dllexport) DWORD StartHook()
{
DWORD dwSet=0;
g_hHook=SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,g_hInstance,0);
if(g_hHook==NULL)
{
dwSet=GetLastError();
}
return dwSet;
}extern "C"
__declspec(dllexport) DWORD StopHook()
{
if(UnhookWindowsHookEx(g_hHook))
{
return 0;
}
else
{
return GetLastError();
}
}
遇到的问题是:我用进程管理查看发现该dll文件已经注入到了QQ的进程当中,但是功能并未实现,原因是在调用GetWindowText()函数时会再次调用目标窗口的窗口过程,于是CallWndProc()再次被调用,就形成了一个循环,有新窗口的产生执行到GetWindowText()马上回到了CallWndProc(),而没法执行到我的处理操作.有没有更好的办法判断窗口是否是腾讯QQ的下线通知窗口?
解决方案 »
- 如何对vector<struct A> va 中的结构体中的关键字进行 合并关键字相同的项 和 按该关键字进行从小到大的排序?
- 高分请教:如何更改CEdit的边框线的颜色,线宽等
- 求教!!!怎么退出的啊!!怎么把BYTE数组放进sql server 啊!!!!拜托进来看看啊!!!实在没钱了拜托了!!!
- 谁有牌类游戏代码,我在学编游戏
- 如何使工具栏里的按钮点击后能够高亮度显示?或是直接处于按下状态?
- 第二次提问:odbc方式调用存储过程的疑问
- 谁知道最新的GOOGLE IP?先谢谢了!
- 这条注入语句怎么写?
- 求教实现此问题的可行性。参与者有分,分不够可另开帖子加(上周的分已给出,本周继续讨论)
- 有光标位图的byte,如何显示光标
- 关于Detour
- Socket 若干问题?
SetWindowsHookEx WH_CBT 就行了