DOBON.NET DOBON.NETプログラミング掲示板過去ログ

新しく接続されたドライブの検出

環境/言語:[OS : Windows XP / 言語 : Visual Basic .NET]
分類:[.NET]

VBで新しくドライブが接続されたのを検出したいのですが、どうすればいいのですか?
http://gallery.technet.microsoft.com/scriptcenter/940f4147-3196-4d5a-a9c5-3e00e244cc1e/
http://uchukamen.com/Programming/WMI/#TOC9

この辺が参考になるかと・・・

頑張って下さい!

以上。
■No28870に返信(exefileさんの記事)
> VBで新しくドライブが接続されたのを検出したいのですが、どうすればいいのですか?


リムーバブルディスク挿入の検知などということであれば

WM_DEVICECHANGE,WM_SHNOTIFY等

の語句で検索すれば参考になる記事を見つけられると思います。
■No28870に返信(exefileさんの記事)
> VBで新しくドライブが接続されたのを検出したいのですが、どうすればいいのですか?

こんな感じで。

Imports System.Runtime.InteropServices
Public Class Form1

    Protected Overrides Sub WndProc(ByRef m As Message)
        MyBase.WndProc(m)

        Const WM_DEVICECHANGE As Integer = &H219
        If m.Msg = WM_DEVICECHANGE Then     'デバイスの変更
            Const DBT_DEVICEARRIVAL As Integer = &H8000
            Const DBT_DEVICEREMOVECOMPLETE As Integer = &H8004
            Select Case m.WParam
                Case New IntPtr(DBT_DEVICEARRIVAL)
                    Debug.WriteLine("追加されました。" & String.Join(", ", GetDrives(m.LParam)))
                Case New IntPtr(DBT_DEVICEREMOVECOMPLETE)
                    Debug.WriteLine("削除されました。" & String.Join(", ", GetDrives(m.LParam)))
            End Select
        End If
    End Sub

    Private Function GetDrives(ByVal lparam As IntPtr) As String()
        Dim drv As New List(Of String)()

        Const DBT_DEVTYP_VOLUME As Integer = 2
        If Marshal.ReadInt32(lparam, 4) = DBT_DEVTYP_VOLUME Then
            'Dim dbcv_flags As DEV_BROADCAST_VOLUME_FLAGS
            'dbcv_flags = DirectCast(Marshal.ReadInt32(lparam, 16), DEV_BROADCAST_VOLUME_FLAGS)

            Dim dbcv_unitmask As Integer = Marshal.ReadInt32(lparam, 12)
            Dim mask As Integer = dbcv_unitmask
            For c As Integer = Asc("A") To Asc("Z")
                If (mask And 1) = 1 Then
                    drv.Add(Chr(c) & ":")
                End If
                mask \= 2
            Next
        End If

        Return drv.ToArray()
    End Function

    '<Flags()> Private Enum DEV_BROADCAST_VOLUME_FLAGS
    '    DBTF_MEDIA = 1
    '    DBTF_NET = 2
    'End Enum
End Class
ありがとうございます!うまくいきました!!
返信遅れてすいません
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板