2010-06-16 5 views

답변

2

장치 변경 알림을 등록하면 모든 창 핸들에서 WM_DEVICECHANGE를 캐치 할 수 있습니다. 예를 들면 :

DEV_BROADCAST_DEVICEINTERFACE dbd = { sizeof(dbd) }; 
dbd.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; 
dbd.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE; 
RegisterDeviceNotification(hwnd, &dbd, DEVICE_NOTIFY_WINDOW_HANDLE); 

WM_DEVICECHANGE의의 lParam은 DBT_DEVTYP_DEVICEINTERFACE에 캐스트 할 수 있습니다. 참고 - 장치를 연결하면 WM_DEVICECHANGE 알림이 여러 번 나타날 수 있습니다. 도착 이벤트를 필터링하고 중복을 무시하십시오.

LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(hwnd) 
    { 
     case WM_DEVICE_CHANGE: 
     { 
      PDEV_BROADCAST_HDR pHdr = NULL; 
      PDEV_BROADCAST_DEVICEINTERFACE pDev = NULL; 
      pHdr = (PDEV_BROADCAST_HDR)lParam; 
      bool fDeviceArrival = (wParam == DBT_DEVICEARRIVAL); 
      if (fDeviceArrival) 
      { 
       if (pHdr && (pHdr->dbch_devicetype==DBT_DEVTYP_DEVICEINTERFACE)) 
       { 
        pDev = (PDEV_BROADCAST_DEVICEINTERFACE)lParam; 
       } 
       if (pDev && (pDev->dbcc_classguid == GUID_DEVINTERFACE_USB_DEVICE)) 
       { 
        // the PNP string of the device just plugged is in dbcc_name 
        OutputDebugString(pDev->dbcc_name); 
        OutputDebugString("\r\n"); 
       } 
      } 
     .... 
+0

'WM_DEVICECHANGE'의'lParam'은' DBT_DEVTYP_DEVICEINTERFACE'. 'wParam'에 의존합니다. 예를 들면. wparam이'DBT_DEVICEARRIVAL' 또는'DBT_DEVICEREMOVECOMPLETE'이지만, 그것이 'DBT_DEVNODES_CHANGED'가 아닌 경우에는 캐스팅 될 수 있습니다. 'DBT_DEVNODES_CHANGED'의 경우, lParam은 항상 'zero'입니다. –

1

WMI를 사용하여 작업 할 수 있다고 생각합니다. Win32_LogicalDiskToPartition 클래스를보고 모든 디스크 이름 목록을 얻은 다음 해당 이름을 사용하여 Win32_DiskDrive 클래스와 PNPDeviceID 속성을 쿼리합니다.

실제로 더 나은 지침과 좋은 수업을 위해 here을보세요.

+0

하지만 난 새로 device.At 연결의 장치 인스턴스 ID를 찾으려면 내가 사용자가 allready에 두 개 또는 세 개의 펜 드라이브를 연결하면 그 무엇 새로 연결된 신호 장치의 드라이브 문자를 잘 모릅니다 시간 시스템과 이제 그는 antoher 장치를 삽입하고 있습니다. – Navaneeth

+0

@Navaneeth :'ManagementEventWatcher' 클래스와 'DiskEventArrived'이벤트를보십시오. 이 코드는 구조를 보여 주어야합니다 : http://www.eggheadcafe.com/software/aspnet/31850441/c-usb-pluginremoval-h.aspx –