Bucle que detecte conexión USB

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
mcr_bkn
Mensajes: 19
Registrado: 01 Abr 2013, 18:29

Bucle que detecte conexión USB

Mensaje por mcr_bkn »

amigos, Queria si me pueden ayudar en realizar un bucle para detectar cuando se conecte un pendrive o un smartphone.... esto ocupa mucho recurso ya que siempre va a estar corriendo? bueno a ver si me pueden ayudar...
mcr_bkn
Mensajes: 19
Registrado: 01 Abr 2013, 18:29

Re: Bucle que detecte conexión USB

Mensaje por mcr_bkn »

Una cosa sensilla seria algo asi:

Código: Seleccionar todo


while 1
$var=DriveGetDrive( "REMOVABLE" )
	if $var <> 0 Then
		msgbox(0,"Prueba","Hay " & $var[0] & " Pendrive Conectado")
	Else
		msgbox(0,"Prueba","No hay pendrives conectados")
		sleep(60000)
	EndIf
WEnd

Esperaria 60 segundo para volver a preguntar.
Avatar de Usuario
yasmany
Hacker del Foro
Mensajes: 249
Registrado: 06 Sep 2011, 21:30

Re: Bucle que detecte conexión USB

Mensaje por yasmany »

Talvez te sirva de referencia, esto lo hice hace un tiempo, puede que haya algun error, lo puedes modificar a tu gusto.

Código: Seleccionar todo


#cs
 Desarrollador por yasmany [Yasmany Curimilma]

#ce
#NoTrayIcon
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIComboBox.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <GuiConstantsEx.au3>
#include <EditConstants.au3>
#include <GuiButton.au3>
#include <StaticConstants.au3>

Global $unidad, $cbUnidades, $sText, $resultado, $var, $val, $i,  $dato, $count

$interfaz = GUICreate("Actualizar combo", 250, 140, -1, -1)
$btnObtenerUnidad = GUICtrlCreateButton("Obtener Unidad", 95, 100, 80, 25)
$cbUnidades = GUICtrlCreateCombo("", 25, 15, 193, 25, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL, $CBS_UPPERCASE))
_GUICtrlComboBox_SetCueBanner($cbUnidades, "BUSCAR UNIDAD..")
GUISetState(@SW_SHOW)

While 1
   actualizarComboDeUnidades()
   $nMsg = GUIGetMsg()

   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         If $nMsg = $GUI_EVENT_CLOSE Then
            Exit
         EndIf
      Case $btnObtenerUnidad
         obtenerLetraDeUnidad()
   EndSwitch
WEnd

Func actualizarComboDeUnidades()

   For $i = 0 To _GUICtrlComboBox_GetCount($cbUnidades) - 1
      $dato = _GUICtrlComboBox_GetLBText($cbUnidades, $i, $sText)

      If $sText <> "BUSCAR UNIDAD..." Then
         valordefinido()
         If DriveStatus($unidad) <> "READY" Then
            If GUICtrlRead($cbUnidades) = $sText Then
               GUICtrlSetState($btnObtenerUnidad, $GUI_DISABLE)
               _GUICtrlComboBox_DeleteString($cbUnidades, $i)
               deshabilitarEncerar()
            Else
               _GUICtrlComboBox_DeleteString($cbUnidades, $i)
            EndIf
         EndIf
      EndIf
   Next
   $val = DriveGetDrive("removable")
      If Not @error Then
         For $count = 1 To $val[0]
            If DriveStatus($val[$count]) <> "READY" Then
            Else
               $resultado = StringUpper(DriveGetLabel($val[$count]) & "(" & $val[$count] & ")")
               If _GUICtrlComboBox_FindStringExact($cbUnidades, $resultado) = "-1" Then
                  _GUICtrlComboBox_ShowDropDown($cbUnidades,False)
                  _GUICtrlComboBox_AddString($cbUnidades, $resultado)
                  ConsoleWrite($resultado&@CRLF)
               EndIf

            EndIf
         Next
      EndIf
EndFunc   ;==>actualizarComboDeUnidades

Func deshabilitarEncerar()
   GUICtrlSetState($btnObtenerUnidad, $GUI_DISABLE)
EndFunc   ;==>deshabilitarEncerar

Func valordefinido()
   $contenidocombo1 = StringReplace($sText, "(", "<unidad>")
   $contenidocombo = StringReplace($contenidocombo1, ")", "</unidad>")
   $unidad1 = StringRegExp($contenidocombo, "<(?i)unidad>(.*?)</(?i)unidad>", 1, 1)
   $unidad = $unidad1[0]
EndFunc   ;==>valordefinido

Func obtenerLetraDeUnidad()
   If GUICtrlRead($cbUnidades) <> "BUSCAR UNIDAD..." Then
      $contenidocombo = StringReplace(GUICtrlRead($cbUnidades), "(", "<unidad>")
      $contenidocombo = StringReplace($contenidocombo, ")", "</unidad>")
      $unidad = StringRegExp($contenidocombo, "<(?i)unidad>(.*?)</(?i)unidad>", 1, 1)
      $unidad = $unidad[0]
      MsgBox(64, "Mensaje", "La unidad es " & $unidad)
   EndIf
EndFunc   ;==>obtenerLetraDeUnidad
lugar donde lo publiqué: Publicacion : http://www.emesn.com/autoitforum/viewto ... f=4&t=4110
Saludos :smt024
Obra de modo que merezcas a tu propio juicio y a juicio de los demás la eternidad, que te hagas insustituible que no merezcas morir.
https://www.facebook.com/yasmanycurimilma
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Bucle que detecte conexión USB

Mensaje por Dany »

Podrias hacerlo asi:

Código: Seleccionar todo

Func WM_DEVICECHANGE($hWnd, $Msg, $wParam, $lParam)
 
 
    If ($wParam = $DBT_DEVICEARRIVAL) Or ($wParam = $DBT_DEVICEREMOVECOMPLETE) Then
        Local $DEV_BROADCAST_VOLUME = DllStructCreate("int dbcvsize;int dbcvdevicetype;int dbcvreserved;int dbcvunitmask;" & _
                "ushort dbcvflags", $lParam)
        Local $iDriveType = DllStructGetData($DEV_BROADCAST_VOLUME, "dbcvdevicetype")
    Else
        Return $GUI_RUNDEFMSG
    EndIf
 
    If $iDriveType <> $DBT_DEVTYP_VOLUME Then Return $GUI_RUNDEFMSG
 
    Local $iMask = DllStructGetData($DEV_BROADCAST_VOLUME, "dbcvunitmask")
    $iMask = Log($iMask) / Log(2)
 
    Local $iDrive = Chr(65 + $iMask) & ":"
 
    Switch $wParam
        Case $DBT_DEVICEARRIVAL
       TrayTip("WM_DEVICECHANGE", "Conectado", 5, 1)
 
 
;~         Case $DBT_DEVICEREMOVECOMPLETE
;~             TrayTip("WM_DEVICECHANGE", "Desconectado", 5, 2)
    EndSwitch
 
    Return $GUI_RUNDEFMSG
EndFunc

Saludos
  • ............................................Imagen
    ......................................Imagen
mcr_bkn
Mensajes: 19
Registrado: 01 Abr 2013, 18:29

Re: Bucle que detecte conexión USB

Mensaje por mcr_bkn »

Dany escribió:Podrias hacerlo asi:

Código: Seleccionar todo

Func WM_DEVICECHANGE($hWnd, $Msg, $wParam, $lParam)
 
 
    If ($wParam = $DBT_DEVICEARRIVAL) Or ($wParam = $DBT_DEVICEREMOVECOMPLETE) Then
        Local $DEV_BROADCAST_VOLUME = DllStructCreate("int dbcvsize;int dbcvdevicetype;int dbcvreserved;int dbcvunitmask;" & _
                "ushort dbcvflags", $lParam)
        Local $iDriveType = DllStructGetData($DEV_BROADCAST_VOLUME, "dbcvdevicetype")
    Else
        Return $GUI_RUNDEFMSG
    EndIf
 
    If $iDriveType <> $DBT_DEVTYP_VOLUME Then Return $GUI_RUNDEFMSG
 
    Local $iMask = DllStructGetData($DEV_BROADCAST_VOLUME, "dbcvunitmask")
    $iMask = Log($iMask) / Log(2)
 
    Local $iDrive = Chr(65 + $iMask) & ":"
 
    Switch $wParam
        Case $DBT_DEVICEARRIVAL
       TrayTip("WM_DEVICECHANGE", "Conectado", 5, 1)
 
 
;~         Case $DBT_DEVICEREMOVECOMPLETE
;~             TrayTip("WM_DEVICECHANGE", "Desconectado", 5, 2)
    EndSwitch
 
    Return $GUI_RUNDEFMSG
EndFunc

Saludos


Amigo Dany, habia estado un poco alejado del aprendisaje autoit por falta de tiempo pero ahora trato de retomar poco a poco, no puedo hacer funcionar la función. Pido disculpa desde ante mano si pregunto algo muy descabellado, esta función la tengo que llamar pero que parametros tengo que agregar? para hechar a correr la función necesito $hWnd, $Msg, $wParam y $lParam. a ver si me pueden hechar una mano....


Gracias de ante mano...


Saludos!!
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Bucle que detecte conexión USB

Mensaje por Chefito »

Mmmmmm....buscando un poco en el buscador del foro, encontrarás mucha información sobre este tema, más que repetido :smt024 . Por ejemplo, buscando la palabra usb.

En este caso, esa función recoge los mensajes que envía una unidad usb al ser conectada y desconectada (o expulsada de alguna forma). Gracias a eso, tú puedes tratar esos mensajes y programar lo que quieras. Digamos que lo que haces es programación orientada a eventos (si ocurre un evento, envía un mensaje a la función adecuada, el cual debes tratar y hacer lo que tu quieras).
No debes poner nada en los argumentos ni llamarla de ninguna forma. Ella sabe cuando ejecutarse solita :smt005 .
Para llamar a esa función cuando ocurra algo con el usb, autoit utiliza GUIRegisterMsg($WM_DEVICECHANGE, "DeviceChange"), que debes ponerlo al principio del código.

Tienes ejemplos y códigos, por ejemplo en este post (el cual he buscado :smt003 ): http://www.emesn.com/autoitforum/viewto ... usb#p16631

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
mcr_bkn
Mensajes: 19
Registrado: 01 Abr 2013, 18:29

Re: Bucle que detecte conexión USB

Mensaje por mcr_bkn »

Chefito escribió:Mmmmmm....buscando un poco en el buscador del foro, encontrarás mucha información sobre este tema, más que repetido :smt024 . Por ejemplo, buscando la palabra usb.

En este caso, esa función recoge los mensajes que envía una unidad usb al ser conectada y desconectada (o expulsada de alguna forma). Gracias a eso, tú puedes tratar esos mensajes y programar lo que quieras. Digamos que lo que haces es programación orientada a eventos (si ocurre un evento, envía un mensaje a la función adecuada, el cual debes tratar y hacer lo que tu quieras).
No debes poner nada en los argumentos ni llamarla de ninguna forma. Ella sabe cuando ejecutarse solita :smt005 .
Para llamar a esa función cuando ocurra algo con el usb, autoit utiliza GUIRegisterMsg($WM_DEVICECHANGE, "DeviceChange"), que debes ponerlo al principio del código.

Tienes ejemplos y códigos, por ejemplo en este post (el cual he buscado :smt003 ): http://www.emesn.com/autoitforum/viewto ... usb#p16631

Saludos.
Muchas gracias Chefito, aca me hiciste encontrar algo que me puede ayudar, dejo el codigo:

Código: Seleccionar todo


Global Const $DBT_DEVICEREMOVECOMPLETE = "0x00008004"
Dim $USB_ATTENTION = "0x00000007"

Global Const $DBT_DEVICEARRIVAL     = 0x00008000
Global Const $WM_DEVICECHANGE       = 0x0219
Global Const $tagDEV_BROADCAST_HDR  = "dword dbchsize;dword dbchdevicetype;dword dbchreserved"
Global Const $DBT_DEVTYP_VOLUME     = 0x00000002
Global Const $tagDEV_BROADCAST_VOLUME   = "dword dbcvsize;dword dbcvdevicetype;dword dbcvreserved;dword dbcvunitmask;short dbcvflags"
Global Const $DBTF_MEDIA            = 0x0001
Global Const $DBTF_NET              = 0x0002
;Setup The GUI to watch for the DeviceChange Event

GUICreate("Test")
GUIRegisterMsg($WM_DEVICECHANGE, "DeviceChange")

While 1
    Sleep (1000)
WEnd

Func DeviceChange($hWndGUI, $MsgID, $WParam, $LParam)
   ;ConsoleWrite($wparam)
    $iEvent = $WParam
   If $iEvent=$DBT_DEVICEREMOVECOMPLETE Then
            $temp = DllStructCreate($tagDEV_BROADCAST_HDR, $LParam)
            $iDeviceType = DllStructGetData($temp, "dbchdevicetype")
            If $iDeviceType = $DBT_DEVTYP_VOLUME Then
                $struct = DllStructCreate($tagDEV_BROADCAST_VOLUME, $LParam)
                $iUnitMask = DllStructGetData($struct, "dbcvunitmask")
                $iFlags = DllStructGetData($struct, "dbcvflags")
                If Not BitAND($iFlags, $DBTF_MEDIA) And Not BitAND($iFlags, $DBTF_NET) Then
                    $sDrive = FirstDriveFromMask($iUnitMask)
                    msgbox(0,"Prueba USB",$sDrive & ": ha sido quitado o removido!" & @CRLF)
					;ConsoleWrite($sDrive & ": ha sido quitado o removido!" & @CRLF)
                EndIf
            EndIf
   EndIf
    If $iEvent = $DBT_DEVICEARRIVAL Then
            $temp = DllStructCreate($tagDEV_BROADCAST_HDR, $LParam)
            $iDeviceType = DllStructGetData($temp, "dbchdevicetype")
            If $iDeviceType = $DBT_DEVTYP_VOLUME Then
                $struct = DllStructCreate($tagDEV_BROADCAST_VOLUME, $LParam)
                $iUnitMask = DllStructGetData($struct, "dbcvunitmask")
                $iFlags = DllStructGetData($struct, "dbcvflags")
                If Not BitAND($iFlags, $DBTF_MEDIA) And Not BitAND($iFlags, $DBTF_NET) Then
                    $sDrive = FirstDriveFromMask($iUnitMask)
                    msgbox(0,"Prueba USB",$sDrive & ": ha sido insertado!" & @CRLF)
					;ConsoleWrite($sDrive & ": ha sido insertado!" & @CRLF)
                EndIf
            EndIf
    EndIf
EndFunc   ;==>DeviceChange

Func FirstDriveFromMask($unitmask)
    Local $i
    For $i = 0 To 25
        If BitAND($unitmask, 0x1) Then ExitLoop
        $unitmask = BitShift($unitmask, 1)
    Next
    Return Chr($i + Asc('A'))
EndFunc

Responder