Página 1 de 1
Bucle que detecte conexión USB
Publicado: 23 Jun 2014, 21:01
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...
Re: Bucle que detecte conexión USB
Publicado: 24 Jun 2014, 18:09
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.
Re: Bucle que detecte conexión USB
Publicado: 24 Jun 2014, 18:48
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
Re: Bucle que detecte conexión USB
Publicado: 25 Jun 2014, 15:49
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
Re: Bucle que detecte conexión USB
Publicado: 27 Jul 2014, 22:49
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!!
Re: Bucle que detecte conexión USB
Publicado: 11 Ago 2014, 17:32
por Chefito
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.
Re: Bucle que detecte conexión USB
Publicado: 11 Ago 2014, 21:17
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
. 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.
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