DeviceAttached сообщение никогда не приходит - PullRequest
2 голосов
/ 12 января 2010

Я пытаюсь разработать приложение на C #, которое может взаимодействовать с USB HID. Я переопределил мой метод WndProc, чтобы он перехватывал все события WM_DEVICECHANGE и передавал метод DeviceChange методу OnDeviceChange (этот код фактически заимствован у Яна Аксельсона), который выглядит следующим образом ....

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? Есть идеи?

Ответы [ 2 ]

1 голос
/ 12 января 2010

Вам необходимо зарегистрировать свое устройство, чтобы получать прикрепленные и удаленные. См. RegisterDeviceNotification . Здесь является отличным примером для вас.

0 голосов
/ 11 июня 2012

В сеансе отладки Visual Studio может пропускать сообщения.

Я не мог понять, почему пропущены и DBT_DEVICEARRIVAL, и DBT_DEVICEREMOVECOMPLETE. Просто сбросьте точку останова на линии if ( m.Msg == DeviceManagement.WM_DEVICECHANGE ).

Я ответил, потому что пост не был закрыт.

...