我在MFC程序里加载的DLL,如下:
void CProDlg::OnOK() 
{
DWORD kk;
HINSTANCE dllhinstance; typedef BOOL(* INSTALLHOOK)(VOID);        dllhinstance=LoadLibrary("dll.dll"); INSTALLHOOK installhook; if(dllhinstance!=NULL)
{
MessageBox("load library succeed","kk",MB_OK);
installhook=(INSTALLHOOK)GetProcAddress(dllhinstance,"installhook");
if(installhook==NULL)
MessageBox("install error","kk",MB_OK);
if(installhook!=NULL)
{
installhook();
}
}
}DLL的代码如下:
#include "stdafx.h"
# include<stdio.h>
DWORD kk;
# define DBT_DEVICEARRIVAL 0x8000
HHOOK loghook;
HINSTANCE hInstance;//本程序的句柄
BOOL installhook();
void endhook(void);
LRESULT CALLBACK myloghook(int iCode,WPARAM wParam,LPARAM lParam);
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
 )
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
//MessageBox(NULL,"DLL加载","",MB_OK);
hInstance=(HINSTANCE)hModule;
break;
default:
break;
}
    return TRUE;
}BOOL installhook(void)
{
loghook=SetWindowsHookEx(WH_CALLWNDPROC,myloghook,hInstance,0);
if(loghook==NULL)
           MessageBox(NULL,"log hook error","kk",MB_OK);
        else
   MessageBox(NULL,"install hook run","kk",MB_OK);
return true;
}
void endhook(void)
{
UnhookWindowsHookEx(loghook);
}
LRESULT CALLBACK myloghook(int iCode,WPARAM wParam,LPARAM lParam)
{
MessageBox(NULL,"安装","",MB_OK);
//ExitWindowsEx(EWX_LOGOFF,0);
//printf("nihao\n");
if(iCode==HC_ACTION)
{
PCWPSTRUCT msg=PCWPSTRUCT(lParam);
if(msg->message==WM_DEVICECHANGE)
{
if(msg->lParam==0x8000)//DBT_DEVICEARRIVAL
{
MessageBox(NULL,"有移动设备插入!","警告!",MB_OK);
}
}
}
   return CallNextHookEx(loghook,iCode,wParam,lParam);
}但是钩子函数却没有执行,并且loghook不为NULL,不知道怎么回事,请大家指教,谢谢。

解决方案 »

  1.   

    你钩子写的有问题Calling the CallNextHookEx function to chain to the next hook procedure is optional, but it is highly recommended; otherwise, other applications that have installed hooks will not receive hook notifications and may behave incorrectly as a result. You should call CallNextHookEx unless you absolutely need to prevent the notification from being seen by other applications. 
      

  2.   

    DLL文件#include "stdafx.h"#include<stdio.h>
    #include<stdlib.h>
    DWORD kk;
    #define DBT_DEVICEARRIVAL 0x8000
    HHOOK loghook;
    HINSTANCE hInstance;//本程序的句柄
    BOOL _stdcall installhook();
    void _stdcall endhook(void);
    LRESULT CALLBACK myloghook(int iCode,WPARAM wParam,LPARAM lParam);
    BOOL APIENTRY DllMain( HANDLE hModule,  
      DWORD ul_reason_for_call,  
      LPVOID lpReserved
    )
    {
    switch(ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    //MessageBox(NULL,"DLL加载","",MB_OK);
    hInstance=(HINSTANCE)hModule;
    break;
    default:
    break;
    }
      return TRUE;
    }BOOL _stdcall installhook(void)
    {
    loghook=SetWindowsHookEx(WH_KEYBOARD,myloghook,hInstance,0);
    if(loghook==NULL)
      MessageBox(NULL,"log hook error","kk",MB_OK);
      else
      MessageBox(NULL,"install hook run","kk",MB_OK);
    return true;
    }
    void _stdcall endhook(void)
    {
    UnhookWindowsHookEx(loghook);
    }
    LRESULT CALLBACK myloghook(int iCode,WPARAM wParam,LPARAM lParam)
    {
    MessageBox(NULL,"安装","",MB_OK);
    //ExitWindowsEx(EWX_LOGOFF,0);
    //printf("nihao\n");
    if(iCode==HC_ACTION)
    {
    PCWPSTRUCT msg=PCWPSTRUCT(lParam);
    if(msg->message==WM_DEVICECHANGE)
    {
    if(msg->lParam==0x8000)//DBT_DEVICEARRIVAL
    {
    MessageBox(NULL,"有移动设备插入!","警告!",MB_OK);
    }
    }
    }
      return CallNextHookEx(loghook,iCode,wParam,lParam);
    }
      

  3.   

    def文件
    LIBRARY 1111
    EXPORTS
    installhook
    endhook
      

  4.   

    def文件中 LIBRARY 后面是你的Dll名字(我调试的时候用的是1111),#include<stdlib.h>头文件不用加
    我试了试 你的钩子是起作用了 至于逻辑问题 就看你了 嘿嘿 
      

  5.   

    为啥vc板块老看到SetWindowHookEx
      

  6.   

    我加上了LIBRARY dll之后,还是不行啊,插入U盘没有反应
      

  7.   

    在 上面 DLL的代码中:BOOL installhook(void)
    {
       loghook=SetWindowsHookEx(WH_CALLWNDPROC,myloghook,hInstance,0);   if(loghook==NULL)
          MessageBox(NULL,"log hook error","kk",MB_OK);
       else
          MessageBox(NULL,"install hook run","kk",MB_OK);
       return true;
    }这里的loghook返回的已经不是0了,但是钩子函数为何不执行呢?
      

  8.   

    [CODE]
    #include "stdafx.h"#include<stdio.h>
    DWORD kk;
    #define DBT_DEVICEARRIVAL 0x8000
    HHOOK loghook;
    HINSTANCE hInstance;//本程序的句柄
    BOOL _stdcall installhook();
    void _stdcall endhook(void);
    LRESULT CALLBACK myloghook(int iCode,WPARAM wParam,LPARAM lParam);
    BOOL APIENTRY DllMain( HANDLE hModule,  
      DWORD ul_reason_for_call,  
      LPVOID lpReserved
      )
    {
    switch(ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    //MessageBox(NULL,"DLL加载","",MB_OK);
    hInstance=(HINSTANCE)hModule;
    break;
    default:
    break;
    }
    return TRUE;
    }BOOL _stdcall installhook(void)
    {
    //查找指定窗口,让指定窗口接收消息.要不然会有N多条消息.好多好多啊.不信可以试试:)
    HWND  MyHwnd= ::FindWindow(NULL,"Test");
    if (MyHwnd == NULL)
    {
    OutputDebugString("查找窗口失败");
    return FALSE;
    }
    //获得指定窗口的线程ID
    DWORD  dwThreadID = GetWindowThreadProcessId(MyHwnd,NULL);
    loghook=SetWindowsHookEx(WH_CALLWNDPROC,myloghook,hInstance,dwThreadID);
    if(loghook==NULL)
    {
    OutputDebugString("函数挂钩错误");
    return FALSE;
    } return TRUE;
    }
    void _stdcall endhook(void)
    {
    UnhookWindowsHookEx(loghook);
    }
    LRESULT CALLBACK myloghook(int iCode,WPARAM wParam,LPARAM lParam)
    {
    //ExitWindowsEx(EWX_LOGOFF,0);
    //printf("nihao\n");
       if(iCode==HC_ACTION)
    {
    CWPSTRUCT *msg = (CWPSTRUCT *)lParam;
    if (msg->message == WM_DEVICECHANGE)
    {
    if(msg->wParam == DBT_DEVICEARRIVAL)
    {
    MessageBox(NULL,"A device or piece of media has been inserted and is now available.","",MB_OK);

    //你要做的事情
    }
    }
    }
    return CallNextHookEx(loghook,iCode,wParam,lParam);
    }
    [\CODE]
      

  9.   

    我测试的没有问题 能捕捉到U盘消息。如果你那还不行我可以把我的测试程序发给你。我的环境是VC6 XP3
      

  10.   

    注意 :这是你写的
    if(msg->lParam==0x8000)//DBT_DEVICEARRIVAL
    {
    MessageBox(NULL,"有移动设备插入!","警告!",MB_OK);
    }
    msg->lParam正确的应该是msg->wParam,拼写错误?
      

  11.   

    我用sreng检查,也没有API HOOK,安全软件都关了啊,在MFC里写了一个局部钩子可以使用
      

  12.   

    是XP吗?win7或Vista好像不一样吧?
      

  13.   

    http://www.cppblog.com/sleepwom/archive/2010/02/03/106672.aspx