关闭对话框时,指定的钩子函数没有运行而是正常关闭了对话框,请问我该怎么办??恳请大虾帮助!!
代码如下:
#include <windows.h>
#include "resource.h"
//自定义函数的声明:
LRESULT CALLBACK About1(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam);int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
HHOOK hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)HookProc,hInstance,GetCurrentProcessId());
if(hHook!=NULL)
{
        MessageBox(0,"钩子安装失败!",NULL,0);
return 0;
}
MessageBox(0,"钩子已安装!",NULL,0);
DialogBox(hInst, (LPCTSTR)IDD_DIALOGBOX/*指向对话框资源*/, 0, 
   (DLGPROC)About1/*回调函数名*/);
  return 0;
}LRESULT CALLBACK About1(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
if (LOWORD(wParam) == IDCANCEL) 
{
EndDialog(hDlg, LOWORD(wParam));
return true;
}
}

    return 0;
}
//钩子函数定义:
LRESULT CALLBACK HookProc(int nCode,WPARAM wPARAM,LPARAM lPARAM)
{
MessageBox(0,"钩子函数成功运行!",NULL,0);
return 0;
}
解决了马上加分。

解决方案 »

  1.   

    挂勾子时用的是线程ID不是进程ID
    HHOOK hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)HookProc,hInstance,GetCurrentThreadId()); 
      

  2.   

    按上面改了之后跑了下,勾子运行没有问题。不过你下面这个hInst是哪里来的?全局的话最好命名时加个前缀,测试程序也应该注意一下 +_+DialogBox(hInst, (LPCTSTR)IDD_DIALOGBOX/*指向对话框资源*/, 0,  
       (DLGPROC)About1/*回调函数名*/); 
      

  3.   

    if(hHook!=NULL) 

            MessageBox(0,"钩子安装失败!",NULL,0); 
    return 0; 
    } 是不是错了,hHook==NULL才是失败,不是NULL应该是成功呀。还有把GetCurrentProcessId()改成 0 试试
      

  4.   

    我这有个例程,楼主药的话可以发个邮件给我我给你发过去
    [email protected]
      

  5.   


    dwThreadId
    [in] Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread. 如果设成0那就是对所有与当前线程同一个桌面的线程都挂上了 +_+
      

  6.   

    Return Values
    If the function succeeds, the return value is the handle to the hook procedure. If the function fails, the return value is NULL. To get extended error information, call GetLastError.
      

  7.   

    按照指定的错误修改了一下。
    请问是不是,钩子安装成功的话,应该在点击DialogBox所指对话框的关闭按钮时,对话框不会关闭而是弹出钩子所指定的MessageBox消息框啊?(我的不知道怎么回事点击一下就直接关上了,GetCurrentProcessId(),hHook!=NULL,hinst都修改过了。)
      

  8.   

    你修改后的代码是怎么写的?运行过程中显示了哪些MessageBox?你的代码中还有一些问题,SetWindowsHookEx的返回值需要保存到全局变量,在Hook函数中要调用CallNextHookEx(参考MSDN中的相关说明)。另外,不能一进入Hook函数就显示MessageBox,因为MessageBox还会产生新的消息,这样会导致程序死掉,你可以判断特定的消息来处理。还要说明一点,你现在钩的是GetMessage,很多消息是不钩不到的,包括WM_CLOSE,你应该钩WindowProc。
      

  9.   

    修改后的.cpp与原文件差不多,只是把以上几个错误修改后重新运行,还是没有出现钩子函数要输出的消息框。11楼:“现在钩的是GetMessage,很多消息是不钩不到的,包括WM_CLOSE,你应该钩WindowProc”是什么意思?
    这个进程不是只有一个线程吗?而且按你说的,我
    该如何钩取WindowsPro呢?
      

  10.   

    如果把线程号设为0,那么HOOK函数必须在一个DLL中
      

  11.   

    SetWindowsHookEx的第1个参数指定要Hook哪类消息,如果给WH_CALLWNDPROC就是Hook WindowProc。