我现在用hook作了一个动态库,想用它来完成对windows中其他进程的观察(监视进程的创建)。我不清楚应该用那一种hook才行,我试了用WH_GETMESSAGE、WH_SHELL、WH_CBT、WH_CALLWNDPROC(在SetWindowsHookEx函数中)都没有成功,不知道错在哪里?还有就是我一应该在所设定的处理消息的函数中处理哪个动作才能达到目的呢?
注:我只写过捕获鼠标的hook程序。我现在这个程序是用它改过来的。
请高手帮我看看我的程序错在哪里?该如何改。我将不胜感激。
源程序如下:
------------------------------------------------------------------------
static AFX_EXTENSION_MODULE MouseHookDLL = { NULL, NULL };
#pragma data_seg("mydata")  
HWND glhPrevTarWnd=NULL;//上次鼠标所指的窗口句柄  
HWND glhDisplayWnd1=NULL;//显示目标窗口标题编辑框的句柄
HWND glhDisplayWnd2=NULL;//显示窗口程序的路径
HHOOK glhHook=NULL;//安装的勾子句柄  
HINSTANCE glhInstance=NULL;//DLL实例句柄  
#pragma data_seg()  extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(lpReserved); 
if (dwReason == DLL_PROCESS_ATTACH) 

if (!AfxInitExtensionModule(MouseHookDLL, hInstance)) 
return 0; 
new CDynLinkLibrary(MouseHookDLL); 
glhInstance=hInstance; //插入保存DLL实例句柄 

else if (dwReason == DLL_PROCESS_DETACH) 

AfxTermExtensionModule(MouseHookDLL); 

return 1; // ok }
CMouseHook::CMouseHook() //类构造函数  
{  
}
 
CMouseHook::~CMouseHook() //类析构函数  
{  
StopHook();  
}LRESULT WINAPI CallWndProc(int nCode,WPARAM wparam,LPARAM lparam);
BOOL CMouseHook::StartHook(HWND hWnd1, HWND hWnd2)
//安装钩子并设定接收显示窗口句柄  
{  
BOOL bResult=FALSE;  
glhHook=SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,glhInstance,0);  
if(glhHook!=NULL)  
bResult=TRUE;  
glhDisplayWnd1=hWnd1;
glhDisplayWnd2=hWnd2;
//设置显示目标窗口标题编辑框的句柄  
return bResult;  
}BOOL CMouseHook::StopHook()//卸载钩子
{
BOOL bResult=FALSE;
if(glhHook)
{
bResult= UnhookWindowsHookEx(glhHook);
if(bResult)
{
glhPrevTarWnd=NULL;
glhDisplayWnd1=NULL;//清变量
glhDisplayWnd2=NULL;//清变量
glhHook=NULL;
}
}
return bResult;
}  LRESULT WINAPI CallWndProc(int nCode,WPARAM wparam,LPARAM lparam)  
{  
PCWPSTRUCT pCWPSTRUCT=(CWPSTRUCT FAR *) lparam;
if (nCode == HC_ACTION)
{
HWND glhTargetWnd=pCWPSTRUCT->hwnd;//取目标窗口句柄  
HWND ParentWnd=glhTargetWnd;  
while (ParentWnd !=NULL)  
{  
glhTargetWnd=ParentWnd;
ParentWnd=GetParent(glhTargetWnd);//取应用程序主窗口句柄  
}  
if(glhTargetWnd!=glhPrevTarWnd)  
{  
char szCaption[100];  
GetWindowText(glhTargetWnd,szCaption,100); //取目标窗口标题
TCHAR exeFullPath[MAX_PATH];
GetModuleFileName(NULL, exeFullPath, MAX_PATH);//取得目标窗口程序的路径 if(IsWindow(glhDisplayWnd1) && IsWindow(glhDisplayWnd2))  
{
SendMessage(glhDisplayWnd1,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);
SendMessage(glhDisplayWnd2,WM_SETTEXT,0,(LPARAM)(LPCTSTR)exeFullPath);
}
glhPrevTarWnd=glhTargetWnd;//保存目标窗口  
}
}
return CallNextHookEx(glhHook,nCode,wparam,lparam); //继续传递消息  
}  

解决方案 »

  1.   

    回调函数的写法不对:
    LRESULT __declspec(dllexport)__stdcall  CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    PCWPSTRUCT pcw=(PCWPSTRUCT) lParam;

    if(nCode>=0 && pcw && pcw->hwnd)
    {
    // if(pcw->message==WM_LBUTTONDOWN)
    // return 0;
    if(pcw->message==WM_SHOWWINDOW)
    {
                                
                                 }
             }
    }
      

  2.   

    我说点泼凉水的话监控进程创建光用钩子是不够的,你需要hook api,进入到每个进程空间以后,hook住createprocess函数,这样新创建的进程才能发现
      

  3.   

    如果你只是监控有窗口的进程用hook就完全可以
      

  4.   

    非常感谢你的帮助,我的问题已经解决了。通过看你的程序我知道我的问题出在哪里了?不过你给的程序中AFX_MANAGE_STATE(AfxGetStaticModuleState());一句我要注释才能运行。如果保留的话在联接时会报如下错误:
    mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in MouseHook.obj
    mfcs42d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in MouseHook.obj
    mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in MouseHook.obj
    mfcs42d.lib(dllmodul.obj) : warning LNK4006: _DllMain@12 already defined in MouseHook.obj; second definition ignored
    mfcs42d.lib(dllmodul.obj) : warning LNK4006: __pRawDllMain already defined in MouseHook.obj; second definition ignored
       Creating library Debug/MouseHook.lib and object Debug/MouseHook.exp
    Debug/MouseHook.dll : fatal error LNK1169: one or more multiply defined symbols found
    Error executing link.exe.MouseHook.dll - 4 error(s), 2 warning(s)
    AfxGetStaticModuleState函数的使用不了解,这是为什么呢?
    我昨天刚接触hook,所以不是很了解,也找不到相关的书看。动态库深入的东东我也不很懂。希望你能给我一些帮助,给我提供一些相关的资料。以后还要你多多指教。
    [email protected]
      

  5.   

    照着MSDN看帮助,然后自己hook实践,如是而已