直接看代码吧.
我做了个DLL的HOOK,DLL1是一个导出类.
下面是.H文件.有个static HWND hQQWnd;来存找到窗口的句柄,但这个变量到使用时变为了空. 
class DLLAPI Dll1
{
public:
    Dll1(void);
    ~Dll1(void);
    //int add(int a, int b);
    bool GetWnd(void);
private:
    DWORD dwThreadID;
public:
    static HHOOK hMouseHook;
    static HWND hQQWnd;
   
    static LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam);
};下面是.CPP文件 在getwnd()里找窗口.付值给hQQWnd#include "StdAfx.h"
#define DLLAPI __declspec(dllexport)
#include "Hook.h"
#include "Dll1.h"
HHOOK Dll1::hMouseHook=NULL;//在这里初始化
HWND Dll1::hQQWnd=NULL;
Dll1::Dll1(void)
{
}Dll1::~Dll1(void)
{
}
extern CHookApp theApp;
bool Dll1::GetWnd(void)
{
    HWND hParentWnd;
        hQQWnd=FindWindow(NULL,_T("外挂eBook"));
    hParentWnd=GetForegroundWindow();
    if(hQQWnd==NULL)
    {
        
        MessageBox(hParentWnd,_T("没找到"),_T("没找到"),MB_OK);
        
    }
    else
    {        dwThreadID = GetWindowThreadProcessId(hQQWnd,NULL);
        //SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, theApp.m_hInstance,dwThreadID);
        hMouseHook=SetWindowsHookEx(WH_MOUSE, MouseProc,  theApp.m_hInstance,dwThreadID);
        MessageBox(hParentWnd,_T("找到了"),_T("找到了"),MB_OK);
        
    }
    
    return false;
}下面是钩子函数 是一个DLL1的静态函数LRESULT CALLBACK Dll1::MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{    CWnd* pWnd;
//出错就出在这,这时得到了一个桌面的dc 然后画的线从桌面的顶端开始画线.
//然后我测试了一下发现hQQWnd为NULL
//如果在这里加一句hQQWnd=FindWindow(NULL,_T("外挂eBook")); 重新付值 就正确了.
    CClientDC dc(pWnd->FromHandle(hQQWnd));    if(wParam==WM_MOUSEMOVE)
    {
    dc.MoveTo(0,0);
    dc.LineTo(500,500);
    }
    return CallNextHookEx(hMouseHook,nCode,wParam,lParam);
}在EXE里这是调用的代码.这是在EXE程序里调用的.
   Dll1 dll1;
    dll1.GetWnd();都弄两天了不知道原因.C++真是太难了.

解决方案 »

  1.   

    静态变量的赋值不对。
    hQQWnd=FindWindow(NULL,_T("外挂eBook"));
    --
    Dll1::hQQWnd=FindWindow(NULL,_T("外挂eBook"));
      

  2.   

    按你说的全改成Dll1::hQQWnd了.还是不行???
    能加我QQ,帮我解决一下吗??3066566感激不尽.
      

  3.   

    static HWND hQQWnd; 
    别这么用了,别作为类的成员变量,把这个变量放到一个共享段中吧/*把你的全局变量集中放到这个段中*/
    #pragma data_seg("MySec")
    HWND g_hQQWnd=NULL;
    #pragma data_seg()
    #pragma comment(linker,"/section:MySec,RWS")然后在DllName.def文件中,设置共享段:
    LIBRARY  HookObjectLib
    EXPORTSSEGMENTS
      .MySec READ WRITE SHARED这样你那个动态库在哪里使用,也不会丢掉数据。为什么会丢数据?这跟动态库的映射有关系,数据段也会跟着映射的。在A程序中时得到一个句柄,当DLL映射到B程序中时,会重新映射一个数据段,此时新数据段的那个句柄就是空的了。共享段不发生映射,只有一个拷贝,所有程序共享.