Bucle que detecte conexión USB
Bucle que detecte conexión USB
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...
Re: Bucle que detecte conexión USB
Una cosa sensilla seria algo asi:
Esperaria 60 segundo para volver a preguntar.
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
Re: Bucle que detecte conexión USB
Talvez te sirva de referencia, esto lo hice hace un tiempo, puede que haya algun error, lo puedes modificar a tu gusto.
lugar donde lo publiqué: Publicacion : http://www.emesn.com/autoitforum/viewto ... f=4&t=4110
Saludos
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
Saludos

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
https://www.facebook.com/yasmanycurimilma
Re: Bucle que detecte conexión USB
Podrias hacerlo asi:
Saludos
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
- ............................................
......................................
Re: Bucle que detecte conexión USB
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!!
- 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
Mmmmmm....buscando un poco en el buscador del foro, encontrarás mucha información sobre este tema, más que repetido
. 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
.
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
): http://www.emesn.com/autoitforum/viewto ... usb#p16631
Saludos.

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

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

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 ;).
Re: Bucle que detecte conexión USB
Muchas gracias Chefito, aca me hiciste encontrar algo que me puede ayudar, dejo el codigo:Chefito escribió:Mmmmmm....buscando un poco en el buscador del foro, encontrarás mucha información sobre este tema, más que repetido. 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.
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): http://www.emesn.com/autoitforum/viewto ... usb#p16631
Saludos.
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