none
.net程序如何接收并处理USB设备插入/拔出事件 RRS feed

  • 问题

  • 当我插入或拔出USB设备的时候,我希望我的.net程序可执行一段相应的处理代码。这就涉及到.net程序如何接收USB设备的插入/拔出事件。

    一种可行的方案是利用Winform的WndProc(ref Message m)来截获windows消息0x219,然后处理。该方法的最大问题是处理设备改变事件代码与界面代码耦合太紧。从软件架构的角度上来说,不是好的解决方案。

    我现在希望能有另一种可以接收和处理USB设备的插入/拔出事件的方案,但不能与界面耦合。

    不知道大家有没有什么好的方法?谢谢。

    2011年2月1日 2:44

答案

  • dear
    如果是我,我不会自行处理这部份,我会直接用Control.Wndproc,要松耦合也是要付出代价的,你可分析有无松耦合必要性。

    或许使用Win32 API能达到你要的
        * CallWindowProc
        * DefWindowProc
        * WindowProc

    API函数,声明如下:
    Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal HWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    其中各参数的意义如下:
             参数                  意义
    lpPrevWndFunc  Long,   原来的窗口过程地址
    HWnd Long,                  窗口句柄
    Msg Long,                  发送的消息
    wParam Long,        消息类型,参考wParam参数表  
    lParam Long,         依据wParam参数的不同而不同

    Window Procedure Functions
    http://msdn.microsoft.com/en-us/library/ff468930%28VS.85%29.aspx


    下面有些hook的例子看看对你是否有用

    C#强化系列文章二:在C#中使用钩子
    http://www.cnblogs.com/firstyi/archive/2008/01/08/1030761.html

    看看C# Hook 如何实现
    http://developer.51cto.com/art/200908/147057.htm

    C# 全域鍵盤掛鉤(Global Keyboard Hook)範例
    http://www.dotblogs.com.tw/huanlin/archive/2008/04/23/3320.aspx

    C# 鍵盤掛鉤(keyboard hook)範例
    http://www.dotblogs.com.tw/huanlin/archive/2008/04/23/3319.aspx

    [C#]偵測是否有卸除式存放裝置插入,使用 WndProc 方法與 DriveInfo 類別
    http://www.dotblogs.com.tw/chou/archive/2009/06/25/8993.aspx

    [C#] 監控USB插拔
    http://kuomingwang.blogspot.com/2010/09/c-usb.html
    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    • 已建议为答案 Paul Zhou 2011年2月3日 3:19
    • 取消建议作为答案 廖斌 2011年2月4日 14:52
    • 已标记为答案 Paul Zhou 2011年2月10日 2:00
    • 取消答案标记 廖斌 2011年2月11日 15:09
    • 已标记为答案 肖小勇Moderator 2011年3月16日 16:01
    2011年2月2日 16:40

全部回复

  • dear
    有个思路提供给你看您合不合用,自己写个使用者控件(UserControl),并复写WndProc,那这个控件就是专门用来接收Windows Message的USB事件,也可达到Reuse的功能,只要有继承system.windows.forms.control的元件,都可以拿来运用。

    http://msdn.microsoft.com/zh-tw/library/system.windows.forms.control.wndproc.aspx
    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年2月2日 4:08
  • 首先感谢您为我提供这个思路。

    不过您提供的这个方法在我的问题描述中已经提到过。winform和Control之间是继承关系,所以overide Control的WndProc方法,与overide form的wndproc是一回事。而且control在三层架构中也是属于表示层的东西。

    我所希望的解决方案是能与表示层完全分离的事件接收和处理,松耦合是关键。

    经过多方研究,我发现了一个思路。在.net中我通过调用win32 api向系统注册hook,但是对于这种USB设备插入/拔出事件我不知道应该使用哪种hook,我试过wh_hardware hook是不行的。

    不知道您对这方面有没有什么了解,再次感谢。

     

    2011年2月2日 5:36
  • dear
    如果是我,我不会自行处理这部份,我会直接用Control.Wndproc,要松耦合也是要付出代价的,你可分析有无松耦合必要性。

    或许使用Win32 API能达到你要的
        * CallWindowProc
        * DefWindowProc
        * WindowProc

    API函数,声明如下:
    Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal HWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    其中各参数的意义如下:
             参数                  意义
    lpPrevWndFunc  Long,   原来的窗口过程地址
    HWnd Long,                  窗口句柄
    Msg Long,                  发送的消息
    wParam Long,        消息类型,参考wParam参数表  
    lParam Long,         依据wParam参数的不同而不同

    Window Procedure Functions
    http://msdn.microsoft.com/en-us/library/ff468930%28VS.85%29.aspx


    下面有些hook的例子看看对你是否有用

    C#强化系列文章二:在C#中使用钩子
    http://www.cnblogs.com/firstyi/archive/2008/01/08/1030761.html

    看看C# Hook 如何实现
    http://developer.51cto.com/art/200908/147057.htm

    C# 全域鍵盤掛鉤(Global Keyboard Hook)範例
    http://www.dotblogs.com.tw/huanlin/archive/2008/04/23/3320.aspx

    C# 鍵盤掛鉤(keyboard hook)範例
    http://www.dotblogs.com.tw/huanlin/archive/2008/04/23/3319.aspx

    [C#]偵測是否有卸除式存放裝置插入,使用 WndProc 方法與 DriveInfo 類別
    http://www.dotblogs.com.tw/chou/archive/2009/06/25/8993.aspx

    [C#] 監控USB插拔
    http://kuomingwang.blogspot.com/2010/09/c-usb.html
    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    • 已建议为答案 Paul Zhou 2011年2月3日 3:19
    • 取消建议作为答案 廖斌 2011年2月4日 14:52
    • 已标记为答案 Paul Zhou 2011年2月10日 2:00
    • 取消答案标记 廖斌 2011年2月11日 15:09
    • 已标记为答案 肖小勇Moderator 2011年3月16日 16:01
    2011年2月2日 16:40
  • 你好!

    如果还有问题请继教讨论


    知识改变命运,奋斗成就人生!
    2011年3月16日 16:01
    版主