とっちゃん
2004-06-18 08:28:10 UTC
とっちゃんです。
リムーバブルメディア(USBなんかのメディアリーダー)の
抜き差しの検出方法を探しています。
英語も含めGoogleは当たってみましたが
MSDNにあるのと同じ程度の情報しかヒットせず、ほとんど
足がかりがつかめていないというところです。
まだ、XPでしかテストしていないのですが、起動時に
DEV_BROADCAST_DEVICEINTERFACE notifyFilter;
ZeroMemory( ¬ifyFilter, sizeof(notifyFilter) );
notifyFilter.dbcc_size = sizeof(notifyFilter);
notifyFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
RegisterDeviceNotification( m_hWnd, ¬ifyFilter,
DEVICE_NOTIFY_WINDOW_HANDLE|
DEVICE_NOTIFY_ALL_INTERFACE_CLASSES );
で通知を受けるようにしてやることで
USBのストレージデバイスそのものの抜き差しは
通知が来るようになりました。
この状態で通知が来るのは
接続時が
EventType =DBT_DEVNODES_CHANGED
EventType =DBT_DEVICEARRIVAL
devicetype=DBT_DEVTYP_DEVICEINTERFACE
classguid =Unknown({A5DCBF10-6530-11D2-901F-00C04FB951ED})
EventType =DBT_DEVNODES_CHANGED
EventType =DBT_DEVICEARRIVAL
devicetype=DBT_DEVTYP_DEVICEINTERFACE
classguid =GUID_DEVINTERFACE_DISK
EventType =DBT_DEVNODES_CHANGED
EventType =DBT_DEVICEARRIVAL
devicetype=DBT_DEVTYP_DEVICEINTERFACE
classguid =GUID_DEVINTERFACE_PARTITION
EventType =DBT_DEVNODES_CHANGED
EventType =DBT_DEVICEARRIVAL
devicetype=DBT_DEVTYP_DEVICEINTERFACE
classguid =GUID_DEVINTERFACE_VOLUME
EventType =DBT_DEVNODES_CHANGED
EventType =DBT_DEVICEARRIVAL
devicetype=DBT_DEVTYP_VOLUME
flags =0
unitmask =0x00000008
EventType =DBT_DEVNODES_CHANGED
で、取り外したときが
EventType =DBT_DEVNODES_CHANGED
EventType =DBT_DEVNODES_CHANGED
EventType =DBT_DEVICEREMOVECOMPLETE
devicetype=DBT_DEVTYP_DEVICEINTERFACE
classguid =GUID_DEVINTERFACE_VOLUME
EventType =DBT_DEVNODES_CHANGED
EventType =DBT_DEVICEREMOVECOMPLETE
devicetype=DBT_DEVTYP_VOLUME
flags =0
unitmask =0x00000008
EventType =DBT_DEVICEREMOVECOMPLETE
devicetype=DBT_DEVTYP_DEVICEINTERFACE
classguid =GUID_DEVINTERFACE_PARTITION
EventType =DBT_DEVICEREMOVECOMPLETE
devicetype=DBT_DEVTYP_DEVICEINTERFACE
classguid =GUID_DEVINTERFACE_DISK
EventType =DBT_DEVICEREMOVECOMPLETE
devicetype=DBT_DEVTYP_DEVICEINTERFACE
classguid =Unknown({A5DCBF10-6530-11D2-901F-00C04FB951ED})
です。
メディアを抜き差ししただけではWM_DEVICECHANGE 自体が来ません。
もしかしたら他のメッセージとかなのかなと思いつつも
SDKレベルではこれ以上の情報は SetupDi 系APIくらいしか
記述がないため、どこへ向かえばいいのかもわからないという状態です。
XPだと、メディアを入れると自動的に何をしますかってダイアログが
出るので、何らかの手段で検出方法を持っているとは思うのですが。
どうにもならなければポーリングするという方法もあるのですが、
メディア状態を監視していることが主体のソフトではないので
(オプションというよりも、ほとんどおまけみたいな機能)
これは最後手段にと思っています。
元々WM_DEVICECHANGE は CDのメディアチェックでやってたので
段取りそのものは難なく用意できたのですが肝心の通知が
来なくて先に進めない状態です。
OS限定でもいいので通知の受け取り手段を知っている方がいたら
ヒントだけでも教えていただけないでしょうか。
リムーバブルメディア(USBなんかのメディアリーダー)の
抜き差しの検出方法を探しています。
英語も含めGoogleは当たってみましたが
MSDNにあるのと同じ程度の情報しかヒットせず、ほとんど
足がかりがつかめていないというところです。
まだ、XPでしかテストしていないのですが、起動時に
DEV_BROADCAST_DEVICEINTERFACE notifyFilter;
ZeroMemory( ¬ifyFilter, sizeof(notifyFilter) );
notifyFilter.dbcc_size = sizeof(notifyFilter);
notifyFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
RegisterDeviceNotification( m_hWnd, ¬ifyFilter,
DEVICE_NOTIFY_WINDOW_HANDLE|
DEVICE_NOTIFY_ALL_INTERFACE_CLASSES );
で通知を受けるようにしてやることで
USBのストレージデバイスそのものの抜き差しは
通知が来るようになりました。
この状態で通知が来るのは
接続時が
EventType =DBT_DEVNODES_CHANGED
EventType =DBT_DEVICEARRIVAL
devicetype=DBT_DEVTYP_DEVICEINTERFACE
classguid =Unknown({A5DCBF10-6530-11D2-901F-00C04FB951ED})
EventType =DBT_DEVNODES_CHANGED
EventType =DBT_DEVICEARRIVAL
devicetype=DBT_DEVTYP_DEVICEINTERFACE
classguid =GUID_DEVINTERFACE_DISK
EventType =DBT_DEVNODES_CHANGED
EventType =DBT_DEVICEARRIVAL
devicetype=DBT_DEVTYP_DEVICEINTERFACE
classguid =GUID_DEVINTERFACE_PARTITION
EventType =DBT_DEVNODES_CHANGED
EventType =DBT_DEVICEARRIVAL
devicetype=DBT_DEVTYP_DEVICEINTERFACE
classguid =GUID_DEVINTERFACE_VOLUME
EventType =DBT_DEVNODES_CHANGED
EventType =DBT_DEVICEARRIVAL
devicetype=DBT_DEVTYP_VOLUME
flags =0
unitmask =0x00000008
EventType =DBT_DEVNODES_CHANGED
で、取り外したときが
EventType =DBT_DEVNODES_CHANGED
EventType =DBT_DEVNODES_CHANGED
EventType =DBT_DEVICEREMOVECOMPLETE
devicetype=DBT_DEVTYP_DEVICEINTERFACE
classguid =GUID_DEVINTERFACE_VOLUME
EventType =DBT_DEVNODES_CHANGED
EventType =DBT_DEVICEREMOVECOMPLETE
devicetype=DBT_DEVTYP_VOLUME
flags =0
unitmask =0x00000008
EventType =DBT_DEVICEREMOVECOMPLETE
devicetype=DBT_DEVTYP_DEVICEINTERFACE
classguid =GUID_DEVINTERFACE_PARTITION
EventType =DBT_DEVICEREMOVECOMPLETE
devicetype=DBT_DEVTYP_DEVICEINTERFACE
classguid =GUID_DEVINTERFACE_DISK
EventType =DBT_DEVICEREMOVECOMPLETE
devicetype=DBT_DEVTYP_DEVICEINTERFACE
classguid =Unknown({A5DCBF10-6530-11D2-901F-00C04FB951ED})
です。
メディアを抜き差ししただけではWM_DEVICECHANGE 自体が来ません。
もしかしたら他のメッセージとかなのかなと思いつつも
SDKレベルではこれ以上の情報は SetupDi 系APIくらいしか
記述がないため、どこへ向かえばいいのかもわからないという状態です。
XPだと、メディアを入れると自動的に何をしますかってダイアログが
出るので、何らかの手段で検出方法を持っているとは思うのですが。
どうにもならなければポーリングするという方法もあるのですが、
メディア状態を監視していることが主体のソフトではないので
(オプションというよりも、ほとんどおまけみたいな機能)
これは最後手段にと思っています。
元々WM_DEVICECHANGE は CDのメディアチェックでやってたので
段取りそのものは難なく用意できたのですが肝心の通知が
来なくて先に進めない状態です。
OS限定でもいいので通知の受け取り手段を知っている方がいたら
ヒントだけでも教えていただけないでしょうか。