您的位置:首页 > 其它

驱动中识别Usb设备插入拔出消息

2012-08-28 00:10 288 查看
2009-07-19 21:05

驱动中识别Usb设备插入拔出消息

欢迎看看我的另一个小窝,说不定有意外的惊喜哦 ^_^ www.devres.info

驱动中识别Usb设备插入拔出消息 收藏

     想要在驱动中捕获Usb设备的插入和拔出消息,还真是有点困难(当然是对于我这半瓶水来说的)。查查网上,到处都提到的是WM_DEVICECHANGE消息,可是这个是窗口事件,驱动中没有窗口怎么办?没有窗口自己建吧......

    

     首先,介绍下 WM_DEVICECHANGE 消息和应用程序检测方法,只关心我用到的部分。

     WindowProc(UINT message, WPARAM wParam, LPARAM lParam);    // 消息处理函数

     message == WM_DEVICECHANGE;

     wParam == DBT_DEVICEARRIVAL;    // 插入设备

                   == DBT_DEVICEREMOVECOMPLETE;    // 拔出设备

    

     其次,当我使用应用程序测试成功后,出现新问题了,第一,要让应用程序和PDA一同启动;第二,要隐藏应用程序的窗口。第一个问题,貌似可以通过在启动项创建快捷方式的方法解决(没有试验......);第二个问题,原以为很简单,只要设置属性visible就行了,没想到不行(我用的是对话框程序,在调用ShowWindow也没用)。这下可就犯难了......(这要是有哪位大哥知道方法,望不吝赐教)

     最后,介绍我用的方法——后台程序,说穿了就是一个dll,这个东西在启动是,是由系统的服务程序加载的,所以可以保证每次启动时,都可以随系统运行。再说窗口的问题,就是可以自己控制的了,原来说到底是对mfc机制不熟,不知道它在那又把窗口显示出来了......

      当然除了检测WM_DEVICECHANGE,还有其他方法也可以获取USB的插入拔出消息,可以自己创建消息队列,来获取相应的硬件消息,此处只做抛砖引玉,未进行深入研究。

      首先,使用CreateMsgQueue()创建一个消息队列,需要一个MSGQUEUEOPTIONS结构的参数。

      其次,消息队列创建成功后,使用RequestDeviceNotifications()可以注册消息队列到系统中,这样就可以获取相应消息,这里的第一个参数我使用NULL,就是检测所有硬件设备消息。

      再次,以上完成后,就是等待消息队列中消息到达WaitForSingleObject(hMsg...),使用ReadMsgQueue()读取消息即可,此函数的参数类似ReadFile(),读取到消息后就是相应的处理了。

      最后,关闭注册到系统的消息队列,释放消息队列资源......

      通过应用程序测试,可以打印出系统中所有的硬件设备名称,在usb设备插入和拔出时,收到相应的消息。但是当我们把程序在项目中测试时,发现了新的问题,当占用Usb设备端口时,此时拔出Usb设备,两种方法竟然收不到任何消息......  

     

      最终只好在驱动中轮询usb设备端口,以此来判定Usb有没有插入或者拔出。

      以上所写全部为个人理解,限于水平有限,难免存在缺漏和不足,也请看到文章的人海涵。另外说明本博客内凡是技术文章全部为原创,书写风格类似于工作笔记,本着尊重个人劳动成果的原则,如需转载或引用,请添加原始链接或注明出处。

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  测试 mfc dll null 工作