驱动中识别Usb设备插入拔出消息
2012-08-28 00:10
288 查看
2009-07-19 21:05
驱动中识别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有没有插入或者拔出。
以上所写全部为个人理解,限于水平有限,难免存在缺漏和不足,也请看到文章的人海涵。另外说明本博客内凡是技术文章全部为原创,书写风格类似于工作笔记,本着尊重个人劳动成果的原则,如需转载或引用,请添加原始链接或注明出处。
驱动中识别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有没有插入或者拔出。
以上所写全部为个人理解,限于水平有限,难免存在缺漏和不足,也请看到文章的人海涵。另外说明本博客内凡是技术文章全部为原创,书写风格类似于工作笔记,本着尊重个人劳动成果的原则,如需转载或引用,请添加原始链接或注明出处。
相关文章推荐
- Windows中USB设备插入的拔出和所产生的消息值
- Windows中USB设备插入的拔出和所产生的消息值
- iphone4s连接电脑无法识别iphone设备:Apple Mobile Device USB Driver驱动安装失败显示黄色叹号解决办法
- 一个很有用的检测USB设备插入拔出的对象(from Torry's Dephi Pages)
- USB设备插入与拔出的响应
- 一个很有用的检测USB设备插入拔出的对象
- vc中如何可以识别到插入的设备在哪个USB端口
- 应用程序获得USB设备插入或者拔出通知
- 【事件驱动】【数码管识别】 一台电脑能接多少台USB设备
- 如何让插入的usb设备不自动装载驱动,进而使用libusb成功向设备传送数据
- QT编程--监听USB设备拔出和插入。
- 检测USB设备插入和拔出
- 【windows】xp系统的2个usb口都无法识别插入的设备(鼠标和手机插上都无反应)
- 怎么捕获非标准usb设备插入或拔出消息?
- 一个用于监视USB设备插入拔出的程序代码
- WINCE接收设备插入拔出消息
- WINCE接收设备插入拔出消息
- USB设备插入和拔出的波形
- QT 监听 USB 设备 插入、拔出动作
- 如何让内置sdcard不弹出 存储设备插入拔出消息。