HOOK 钩子拦截WM_DEVICECHANGE消息

 钩子的类型总共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测试没有问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值