近期在做一个小玩意,主要目的是想学习一下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的下线通知窗口?