例如,我有一个USB的MODEM,请问怎样在程序里判断它是否已连接或移去?
(在设备管理器中,当一个USB设备加进来的时候,系统会自动显示加进来的设备名,这个动作是否会引起注册表的相应的相应变化?如果要,请问是用哪个键来判断?)
    谢谢

解决方案 »

  1.   

    相应WM_DEVICECHANGE 消息VC代码
    class CWinHidden : 
    public CWindowImpl<CWinHidden, CWindow, CNullTraits>
    {
    BEGIN_MSG_MAP(CWinHidden)
    MESSAGE_HANDLER(WM_DEVICECHANGE, OnDeviceChange)
    MESSAGE_HANDLER(WM_CREATE, OnCreate)
    END_MSG_MAP()
    public:
    LRESULT OnDeviceChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    // TODO : Add Code for message handler. Call DefWindowProc if necessary.
    OutputDebugString("device changed");
    // you can store a pointer to your control class eg pMyControl
    //then call pMyControl->OnDeviceChange(...);
    return 0;
    }

    LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
    // TODO : Add Code for message handler. Call DefWindowProc if necessary.
    RegisterEvent(__FILE__,__LINE__);

    return 0;
    }
    void RegisterEvent(const char* fn,int ln)
    {
    DEV_BROADCAST_DEVICEINTERFACE header = {0};
    header.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
    header.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
    char tmp[256];
    if(NULL==RegisterDeviceNotification(m_hWnd, &header, DEVICE_NOTIFY_WINDOW_HANDLE))
    {
    sprintf(tmp,"%s:%d RegisterDeviceNotification failed",fn,ln);
    }
    else
    {
    sprintf(tmp,"%s:%d RegisterDeviceNotification succeeded",fn,ln);
    }
    OutputDebugString(tmp);

    }

    };
      

  2.   

    Public 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 LongPublic Declare Function GetWindowLong Lib "user32" _
      Alias "GetWindowLongA" (ByVal hwnd As Long, _
                              ByVal nIndex As Long) As LongPublic Declare Function SetWindowLong Lib "user32" _
      Alias "SetWindowLongA" (ByVal hwnd As Long, _
                              ByVal nIndex As Long, _
                              ByVal dwNewLong As Long) As LongPublic Const GWL_WNDPROC = (-4)
    Public Const WM_DEVICECHANGE = &H219Public glngPrevWndProc As Long 
     
    Public Function MyWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
      If Msg = WM_DEVICECHANGE Then
        Select Case wParam
         
         ' If device (CD-ROM) arrive...
          Case &H8000&
            Call Form1.DeviceArrival
         
         ' If CD-ROM has ejected...
          Case &H8004&
            Call Form1.DeviceRemoveComplete
        End Select
        MyWindowProc = 0
        Exit Function
      End If
     
     ' pass the rest messages onto VB's own Window Procedure
      MyWindowProc = CallWindowProc(glngPrevWndProc, hwnd, Msg, wParam, lParam)
    End Function