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测试没有问题。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值