2

我正在尝试开发一个可以与 USB HID 通信的 C# 应用程序。我已经重写了我的 WndProc 方法,以便捕获所有 WM_DEVICECHANGE 事件并将 DeviceChange 方法传递给方法 OnDeviceChange(此代码实际上是从 Jan Axelson 借来的),看起来像这样......

protected override void WndProc( ref Message m ) 
{            
    try 
    { 
        //  The OnDeviceChange routine processes WM_DEVICECHANGE messages.

        if ( m.Msg == DeviceManagement.WM_DEVICECHANGE ) 
        { 
            OnDeviceChange( m ); 
        } 

        //  Let the base form process the message.

        base.WndProc( ref m );                 
    } 
    catch ( Exception ex ) 
    { 
        DisplayException( this.Name, ex ); 
        throw ; 
    }             
} 

但不知为何,每次我插入一个设备,无论是鼠标、键盘还是我正在开发的设备,都是 HID 的,WParam 的值总是 0x7;

我检查了 DBT.h 并且 0x0007 的值是......

#define DBT_DEVNODES_CHANGED            0x0007

/*
 * Message = WM_DEVICECHANGE
 * wParam  = DBT_QUERYCHANGECONFIG
 * lParam  = 0
 *
 *      sent to ask if a config change is allowed
 */....

我不会在收到第一条消息后停下来,我会查看所有消息,并且对于每条消息,值始终为 0x0007。为什么我从未看到 DeviceAttached 或 DeviceRemoved 事件?

有一些USB经验的人有什么想法吗?

4

2 回答 2

1

您需要注册您的设备才能接收附加和删除。请参阅RegisterDeviceNotification是一个很好的例子来帮助你。

于 2010-01-11T23:54:17.330 回答
0

在调试会话中,Visual Studio 可以省略消息。

我不明白为什么两者都DBT_DEVICEARRIVALDBT_DEVICEREMOVECOMPLETE错过了。只需在线取消设置断点 if ( m.Msg == DeviceManagement.WM_DEVICECHANGE )

我已经回答了,因为帖子没有关闭。

于 2012-06-11T14:04:43.723 回答