4

次のコードを使用すると、複数 (3 つまたは 4 つのデバイス到着通知) を受け取る理由を誰か教えてもらえますか?

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    Const WM_DEVICECHANGE As Integer = &H219
    Const DBT_DEVICEARRIVAL As Integer = &H8000
    Const DBT_DEVICEREMOVECOMPLETE As Integer = &H8004

    If m.Msg = WM_DEVICECHANGE Then
        If m.WParam.ToInt32() = DBT_DEVICEARRIVAL then

          messagebox.show("Device arrived")

        ElseIf m.WParam.ToInt32 = DBT_DEVICEREMOVECOMPLETE And valid = True Then
           messagebox.show("device left")
        End If
    End If


    MyBase.WndProc(m)

End Sub

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
Public Structure DEV_BROADCAST_DEVICEINTERFACE
    Public dbcc_size As Integer
    Public dbcc_devicetype As Integer
    Public dbcc_reserved As Integer
    <MarshalAs(UnmanagedType.ByValArray, ArraySubType:=UnmanagedType.U1, SizeConst:=16)> _
    Public dbcc_classguid As Byte()

    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=128)> _
    Public dbcc_name As Char()
End Structure


Public Sub RegisterDeviceNotification()
    Dim usb_id As String = "745dd1a8-fca4-4659-9df2-954176705158"
    Dim deviceInterface As New DEV_BROADCAST_DEVICEINTERFACE()
    Dim size As Integer = Marshal.SizeOf(deviceInterface)
    deviceInterface.dbcc_size = size
    deviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE
    deviceInterface.dbcc_reserved = 0
    deviceInterface.dbcc_classguid = New Guid(usb_id).ToByteArray
    Dim buffer As IntPtr = Nothing
    buffer = Marshal.AllocHGlobal(size)
    Marshal.StructureToPtr(deviceInterface, buffer, True)
    rPS4000 = RegisterDeviceNotification(Me.Handle, buffer, _
                            DEVICE_NOTIFY_WINDOW_HANDLE Or _
                            DEVICE_NOTIFY_ALL_INTERFACE_CLASSES)

End Sub

デバイスが到着したら、マシンに接続されているデバイスを検出するスレッドを開始しようとしています。新しいデバイスが関心のある特定のハードウェア (オシロスコープ) である場合、対応するドライバーを使用してこのデバイスに接続したいと考えています。私が抱えている問題は、複数の DBT_DEVICEEARRIVAL 通知を受け取るため、デバイスが挿入されると、ソフトウェアが複数回接続しようとすることです。これは一度だけ発生させたいです。タイマーを使用してこの問題を解決しましたが、DBT_DEVICEEARRIVAL 通知を 1 つだけ受け取る方法があることを知りたいです。

ありがとう

4

1 に答える 1