接続されたデバイスを検出して一覧表示する C# コードを使用しています。コードは kisok コンピューターで実行され、顧客がファイルに簡単にアクセスしてアップロードできるようにすることになっています。以下のコードは、モバイル デバイスなどのポータブル デバイスを認識しないことを除いて、正常に動作します。
public void WndProc(ref Message m)
{
int devType;
char c;
if (m.Msg == WM_DEVICECHANGE)
{
// WM_DEVICECHANGE can have several meanings depending on the WParam value...
switch (m.WParam.ToInt32())
{
// New device has just arrived
case DBT_DEVICEARRIVAL:
devType = Marshal.ReadInt32(m.LParam, 4);
if (devType == DBT_DEVTYP_VOLUME)
{
DEV_BROADCAST_VOLUME vol;
vol = (DEV_BROADCAST_VOLUME)
Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME));
// Get the drive letter
c = DriveMaskToLetter(vol.dbcv_unitmask);
/* rest of handler is here */
}
break;
case DBT_DEVNODES_CHANGED:
devType = Marshal.ReadInt32(m.LParam, 4); // m.LParam in this case is 0
// handle portable device
break;
}
}
}
したがって、モバイル デバイスの接続時に受信した mWParam は DBT_DEVNODES_CHANGED (0x0007) に等しく、mLParam は 0 です。このイベントからポータブル デバイスを認識することは可能ですか? ここに追加できる関連検出 API はありますか?
次のWMIコードを試しましたが、以前と同様に、USBが接続されているが携帯電話が接続されていない場合にのみHandleEventが起動されます:(
ManagementEventWatcher watcher = new ManagementEventWatcher();
WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2");
watcher.EventArrived += new EventArrivedEventHandler(HandleEvent);
watcher.Query = query;
watcher.Start();
watcher.WaitForNextEvent();