Como detectar USB , Memorias SD y mostrar un aviso?

Iniciado por **Aincrad**, 29 Junio 2018, 04:33 AM

0 Miembros y 1 Visitante están viendo este tema.

**Aincrad**

Buenas, Estoy intentando hacer una app que cuando alguien introduzca un Pendrive o Adaptador SD el programa lo detecte y te muestre un form 2 con un label que contenga la ruta del mismo. pero no logro hacerlo.

Me inmagino que debería definir las letras desde la A hasta la Z en un string saltándome las letras del dico local C y la D. que nunca son de algún dispositivo extraible.

en pocas palabras tengo 2 formularios, el primero detectara si algún dispositivo de almacenamiento extraible es conectado y cuando detecte alguno mostrara el formulario 2 que contendrá la ruta en un label. eso es lo que no logro hacer . :-\  si alguien tiene algún code que me facilite.

Gracias de antemano.




**Aincrad**

Hola , bueno estos dias he estado estudiando y bueno esto he lo que he logrado hacer por mi cuenta :

Código (vbnet) [Seleccionar]
Imports System.IO

Public Class Form1

    Dim Errores As New List(Of String)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        detectar()
    End Sub

    Private Sub detectar()
        For Each USBex In Environment.GetLogicalDrives
            If New DriveInfo(USBex).IsReady = True Then
                If Not New DriveInfo(USBex).DriveType = DriveType.Fixed Then
                    Try
                        ListBox1.Items.Add(USBex)
                    Catch ex As Exception
                        Errores.Add(ex.Message)
                        'ListBox2.Items.Add(errores)
                    End Try
                End If
            End If
        Next
    End Sub

End Class


Con esto ya puedo detectar los discos extraible pero ahora necesito su ayuda para crear un bucle y así poder detectar los nuevos usb que se conectan , pero bueno el bucle no es problema como tal , ya que probé con un bucle for / next .

el problema es que el lista en el listbox1 los viejos usb conectado, y a demás siento que hacer un bucle for/ next  ahi esta mal .

simplemente lo que quiero es que detectete los nuevos usb conectados al PC sin listar los viejos. y muestre un un nuevo form los usb conectados.




Eleкtro

#2
Cita de: **Aincrad** en 29 Junio 2018, 04:33 AM
Me inmagino que debería definir las letras desde la A hasta la Z en un string saltándome las letras del dico local C y la D. que nunca son de algún dispositivo extraible.

Cita de: **Aincrad** en  3 Julio 2018, 21:59 PM
Con esto ya puedo detectar los discos extraible pero ahora necesito su ayuda para crear un bucle y así poder detectar los nuevos usb que se conectan

No, esa no es la manera de hacerlo.

La forma correcta de hacerlo sería o bien procesando el mensaje de ventana WM_DEVICECHANGE en la función WndProc (WindowProcedure) haciendo uso de la estructura nativa DevBroadcastVolume, o bien suscribiéndote a los eventos de las clases de WMI, concretamente a la clase Win32_DeviceChangeEvent si mal no recuerdo: https://docs.microsoft.com/en-us/windows/desktop/CIMWin32Prov/win32-devicechangeevent - sí, acabo de testearlo, aunque como alternativa al parecer también podrías usar la clase Win32_PnPEntity: https://stackoverflow.com/a/5329524/1248295

¿Ventajas y desventajas?, velocidad de ejecución (WM_DEVICECHANGE) versus flexibilidad de código (WMI); por decirlo de una manera entendible, la infraestructura de WMI propaga los datos de las consultas en intervalos algo largos, en comparación.




No viene mal de vez en cuando revisar/buscar en los códigos de la librería de snippets para VB.NET, aquí compartí un monitor de inserción y extracción de dispositivos basado en lo que te estuve comentando de la estructura DevBroadcastVolume:


Y aquí abajo compartí un código que puedas adaptar para suscribirte a los eventos necesarios de las clases de WMI para conseguir el mismo resultado ( observa los ejemplos de utilización que escribí abajo del todo del comentario, en la query de WMI del primer ejemplo solo tendrías que cambiar el nombre de la clase "Win32_VolumeChangeEvent" por "Win32_DeviceChangeEvent" para tenerlo todo listo ):


Saludos








**Aincrad**

Gracias por responder; Revisare los links y me documentare de ello, gracias.

PD : No sabia que habías hecho un snippets tan útil  :D . lo veré y después revisare todo el post del snippets desde la gaina 1 a la 54  :xD , para no volver preguntar cosas que ya prácticamente estan resultas :V  ;D .




Eleкtro

#4
Cita de: **Aincrad** en  4 Julio 2018, 18:06 PM
lo veré y después revisare todo el post del snippets desde la gaina 1 a la 54  :xD , para no volver preguntar cosas que ya prácticamente estan resultas :V  ;D .

Ok, pillo el sarcasmo xD, para mi también sería inaceptable buscar entre 54 páginas, pero ya no hay excusa para eso con el nuevo índice que he creado!:

https://foro.elhacker.net/net/libreria_de_snippets_para_vbnet_compartan_aqui_sus_snippets-t378770.0.html;msg1810584#msg1810584


EDITO: por cierto, se me olvidó que también existía esta otra forma de hacerlo en WindowsForms:

'usar la Class DeviceWatcher en un WinForms, sirve para detectar los eventos de inserción/extracción de los dispositivos[/i]'



saludos








**Aincrad**

Cita de: Eleкtro en  4 Julio 2018, 20:05 PM



No pude haber deseado nada mejor  :D , es perfecto.  ;D Funciona bien y es rápido, Muchísimas Gracias. / Cuando salga de vacaciones me pondré a estudiar mas VB.NET.  ;-)
Gracias por todos tus Grandes aportes.