none
MFC 에서 WM_DEVICECHANGE 메시지의 Wparam이 항상 7로 들어옵니다. RRS feed

  • 질문

  • 안녕하세요?

    현재 USB Device 장치 착/탈시 메시지를 발생시켜

    DBT_DEVICEARRIVAL (0x8000)또는 DBT_DEVICEREMOVECOMPLETE(0x8004)

    값을 받고 싶은데

    wparam에 0x0007이라는 값이 들어옵니다.

    해당 문제를 해결하기 위해 구글링 결과 Oninitdlg에 RegisterDeviceNotification()함수를 사용하라고 해서

    HDEVNOTIFY hDevNotify;
    DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
    ZeroMemory(&NotificationFilter, sizeof(NotificationFilter));
    NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
    NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
    for (int i = 0; i<sizeof(GUID_DEVINTERFACE_LIST) / sizeof(GUID); i++) {
    NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_LIST[i];
    hDevNotify = RegisterDeviceNotification(this->GetSafeHwnd(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
    if (!hDevNotify) {
    AfxMessageBox(CString("Can't register device notification: ")
    + _com_error(GetLastError()).ErrorMessage(), MB_ICONEXCLAMATION);
    return FALSE;
    }
    }

    이렇게 등록을 하였으나 문제는 해결되지 않았습니다.

    그리하여 Winxp환경에서 Test 결과(개발 환경은 Win7 64)정상 동작하는 것을 확인하였고

    조금 더 검색 결과 다이얼로그의 최상위(부모다이얼로그)에서만 정상 결과가 들어온다는 것을 보고

    직접 구현 결과 최상위 다이얼로그에서는 동작하는것을 확인하였습니다.

    하지만 제가 원하는 것은 자식 다이얼로그에서도 해당 기능이 동작하는 것입니다.

    해결 방법이 있는지 문의 드립니다.

    2018년 12월 4일 화요일 오전 1:42

모든 응답

  • 문서에 이미 Top-Level 윈도우가 받을 수 있다고 명시되어 있으니, 자식 대화창에서 받을 별다른 정석은 없습니다. Top-Level 윈도우를 찾아서 Subclassing을 해 해당 이벤트 메시지가 들어올 때 자식 윈도우가 받는 식의 방법 등... 우회적인 꼼수(?)를 써야 합니다.
    2018년 12월 4일 화요일 오전 2:00
  • 문서를 다시 자세히 보면, Top-Level 윈도우만 알림을 받을 수 있다는 것이 아니고 Top-Level 윈도우의 경우 RegisterDeviceNotification 호출을 하지 않아도 기본적인 WM_DEVICECHANGE 이벤트를 받을 수 있다는 것으로 해석해야 합니다.

    즉, 자식 다이얼로그의 HWND 값을 넘겨서 등록했으면 그 윈도우 핸들의 메시지로 WM_DEVICECHANGE가 들어오게 됩니다. 다시 한번 테스트 해보세요, 자식 윈도우에 상관 없이 RegisterDeviceNotification의 첫 번째 인자에 넘긴 윈도우로 알림 메시지가 잘 들어와야 정상입니다. (물론 Top-Level 윈도우에서도 WM_DEVICECHANGE 이벤트가 WPARAM == 7로 들어올 것입니다.)
    2018년 12월 5일 수요일 오전 1:04