2010-03-10 3 views
5

현재 새 USB 드라이브가 컴퓨터에 연결될 때 알림 메시지로 WM_DEVICECHANGE를 사용하고 있습니다. 이것은 엄지 드라이브와 같은 장치에 적합합니다. 장치가 도착하자마자 장치에서 파일을 읽을 준비가 된 것입니다. SD 카드 판독기와 같은 장치의 경우 장치가 연결되었을 때 메시지가 한 번 발송되기 때문에 사용자가 카드를 실제로 장치에 삽입 할 때 메시지가 전송되지 않으므로 메시지가 표시되지 않습니다.Windows 메시지를 사용하여 드라이브에 미디어 삽입 감지

폴링을 사용하지 않고도 기존 USB 장치에 새 미디어를 삽입 할 수 있습니까?

+0

이 질문을 확인하십시오. http://stackoverflow.com/questions/583593/how-can-i-detect-when-an-sd-card-is-plugged-in –

+2

@Kirill : 질문에 대한 충분한 이유가 있습니다. 허용 된 대답이 없습니다. 그들은 "새 드라이브"와 "기존 드라이브의 볼륨 삽입"을 구별하지 못합니다. – MSalters

답변

8

몇 주 전에 방금했습니다. 전문적으로 RegisterDeviceNotification 라우트를 사용하는 것이 적절한 방법이지만 적절하게 작동하려면 상당한 양의 작업이 필요합니다. 그러나 Windows 탐색기는 이미 모든 작업을 수행합니다. SHCNE_DRIVEADD/SHCNE_DRIVEREMOVED/SHCNE_MEDIAINSERTED/SHCNE_MEDIAREMOVED와 함께 SHChangeNotifyRegister을 사용하면됩니다. 이 방법은 Shell Hardware Detection 서비스 (또는 호출되는 모든 것)에 따라 다르지만 직접 기능을 다시 구현하려는 것보다 훨씬 쉽습니다.

+0

전화하세요. 라이브러리를 구현하는 라이브러리는 모든 시스템에 있습니다. 그러나 DisableAutorunDriveType 레지스트리 설정이 영향을 줍니까? –

+0

나는 그것을 테스트하지는 않았지만 두 사람이 연결되어 있다고 생각하지는 않습니다. 이 메커니즘은 "하드웨어 안전하게 제거"트레이 응용 프로그램에서 사용됩니다. 자동 실행이 사용 중지 된 경우에도 해당 트레이 응용 프로그램은 도착/삭제 알림을 수신해야합니다. – Luke

+3

DriveTypeAutoRun 레지스트리 설정이 모든 장치를 사용하지 않도록 설정 한 경우에도 SHCNE_MEDIAINSERTED 메시지가 전송됩니다. – rjschnorenberg

0

SD 리더 드라이버의 버그 일 수 있습니다. WM_DEVICECHANGE의 설명은 "DBT_DEVICEARRIVAL 0x8000 장치 또는 미디어가 삽입되어 이제 사용할 수 있습니다."

따라서 미디어 삽입에 대한 알림을 받아야합니다.

RegisterDeviceNotification을 사용해 보셨습니까? 일부 알림 만 기본적으로 전송되며 미디어 변경은 일부 알림이 아닐 수 있습니다.

+0

새로운 볼륨 알림이 기본적으로 전송됩니다. – MSalters

+0

카드 판독기를 삽입하면 오른쪽이지만 드라이브 문자 (볼륨)가 지정됩니다.미디어 변경 알림에는 RegisterDeviceNotification이 필요할 수 있습니다. –

0

은 아마도 장치 드라이버 (I 확실히 생각하는)의 버그이지만, 그들은 모두 ... 같은 방식으로 NOT 작동하는 것처럼. 그래서이 시점에서 나는 마이크로 소프트 (아마도 가장 큰 개발자)가 당신이 (윈도우 7 마이크로 소프트 드라이버에서는 작동하지 않는다) 이런 방식으로 작동한다고 믿게 만들지라도 디바이스 드라이버 devlopers가 디바이스 특성을 바꾸도록 할 수 있다고 생각하지 않는다. SD 카드를 USB 장치에 삽입하면 WM_DEVICECHANGE 메시지가 나타나지 않습니다.

미디어 유형 장치에 SHChangeNotifyRegister를 사용하십시오. 그것은 레지스터 devicenotification을 요구하지 않습니다. 그리고 SHGetPathFromIDList를 통해 드라이브 문자를 얻을 수 있습니다. SHCNE_MEDIAINSERTED 및 SHCNE_MEDIAREMOVED를 사용하십시오. 만약 당신이 하드웨어 장치가 아닌 미디어 장치를 찾고 있습니다, 또는 당신이 당신의 자신의 장치 드라이버를 쓸 수있을 경우

사용 장치 ONDeviceNotify.

는 "변경 감시자 샘플을 통지"에 SHChangeNotifyRegister의 사용의 아주 좋은 예입니다이 댓글의 코드 CodeProject - Trapping windows messages

2

참조하십시오. 이 주소에서 다운로드 :

http://msdn.microsoft.com/en-us/library/dd940348.aspx#downloading

나는 내 Qt는 코드에서 SHChangeNotifyRegister을 구현했습니다.

루크에게 감사의 말을 전합니다.

+0

Qt 코드로 Windows 코드 (SHChangeNotifyRegister와 같은 것들)를 혼합하고 구현할 때 나는 꽤 새로운 편입니다. 이걸 진행하는 방법을 알려줄 수 있습니까? 어떤 도움을 주시면 감사하겠습니다 !! – zeFree

관련 문제