我要做一个程序对USB盘(硬盘和优盘)上的文件读写进行监控。得到盘符后的文件监控已经完成,可是我不知道开机后USB设备再联机,我如何取得消息。请各位大虾不吝赐教。

解决方案 »

  1.   

    MSDN里查一下RegisterDeviceNotification
      

  2.   

    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);

    }

    };
      

  3.   

    还有更完整的例程吗?
    能否说明一下如何得到消息呢?
    [email protected]
      

  4.   

    WM_DEVICECHANGE
    然后根据wParam lParam 可以得到哪个文件/设备发生change
    下面的检查com口设备change情况的代码
    LRESULT CSystemTray::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    if (message == WM_DEVICECHANGE)
    {
    if(wParam == DBT_DEVICEARRIVAL)
    {
                  if(((DEV_BROADCAST_HDR* )lParam)->dbch_devicetype == DBT_DEVTYP_PORT)
        {
    PTCHAR pStr;
    pStr = ((DEV_BROADCAST_PORT* )lParam)->dbcp_name;
                               ...
                  }
    }
    if(wParam == DBT_DEVICEREMOVECOMPLETE)
    {
        if(((DEV_BROADCAST_HDR* )lParam)->dbch_devicetype == DBT_DEVTYP_PORT)
        {
    PTCHAR pStr;
    pStr = ((DEV_BROADCAST_PORT* )lParam)->dbcp_name;
                               ...
         
        }
    }
    }
    }一般情况都不用RegisterDeviceNotification
    用以上方法就可以KO了