HOOK 钩子拦截WM_DEVICECHANGE消息

来源:互联网 发布:红色经典知多少手抄报 编辑:程序博客网 时间:2024/06/10 21:37

 钩子的类型总共15种,每种钩子处理不同的消息(这个资料很多,自己看下)。

    钩子用SetWindowsHookEx安装,放在DDL中,有全局钩子的,比如键盘,鼠标等,也可以是线程的,指定窗口的(不是很准确,但实用)。是全局还是指定,主要是看SetWindowsHookEx中的参数设置:

全局时:第三个参数为DLL的hInstance,第四个参数为NULL。

线程时:第三个参数NULL。

指定时:第三个参数为DLL的hInstance,第四个参数为为dwThreadId是指定窗口线程ID,这样你就能获得指定窗口的消息了。

 

来实用的,关于如何截获WM_DEVICECHANGE消息,可以用WH_CALLWNDPROC类型的钩子,在回调函数LauncherHook中判断

CWPSTRUCT *msg = (CWPSTRUCT *)lParam;

if (msg->message == WM_DEVICECHANGE)

{

   if(msg->wParam == DBT_DEVICEARRIVAL)
   {
       //    TRACE("j");

       //你要做的事情
   }

}

     可能有人说,哇,收到DBT_DEVICEARRIVAL消息会上百次啊,呵呵,当然啦,WH_CALLWNDPROC类型的钩子就是向每个窗口都发这个消息一次,你的全局钩子自然接收好多好多的噪音,呵呵。

     我们要做的就是指定窗口接收,dwThreadId是指定窗口线程ID,     

DWORD   dwThreadID   =  GetWindowThreadProcessId(Yourhwnd,   NULL);

      Yourhwnd是指定窗口的句柄,我做得是SDK应用程序,没有窗口,于是我获取了Program Manager的句柄(Windows自带的),获取方法:

HWND  Yourhwnd= ::FindWindow("Progman","Program Manager");

     你可以换成你的指定的窗口句柄,这样再安装钩子,DBT_DEVICEARRIVAL只会接收一次,在XP测试没有问题。