Título: iniciar programa al meter mem_usb Publicado por: Anteros en 11 Noviembre 2006, 22:02 pm holas gente como puedo hacer para lo sgte
quiero q mi programa se ponga como servicio y se inicie con windows con un icono en el systemtray el programa debe estar verificando constantemente si esta conectada una memUSB o si se conecta una memUSB para poder iniciar lo q le corresponde al prog se podra hacer? gracias por todo Título: Re: iniciar programa al meter mem_usb Publicado por: Nymphetaminito en 12 Noviembre 2006, 23:46 pm El sistema envía el mensaje WM_DEVICECHANGE a la ventana cuando se encuentra o se elimina un dispositivo. Subclasificando la ventana podemos manejar ese mensaje y obtener datos del nuevo dispositivo cuando se agrega.
En un formulario con un Label de nombre lblInfo peguen el siguiente código: Código: Option Explicit Ahora, ¿cómo funciona el mensaje WM_DEVICECHANGE?. Hay que tener en cuenta dos comportamientos de este mensaje: 1. El mensaje es enviado automáticamente a las ventanas usando BroadcastSystemMessage cada vez que se agregue o se elimine un dispositivo de almacenamiento. 2. Se puede crear un objeto de notificación para varios eventos con dispositivos usando la función RegisterDeviceNotification y destruir este objeto cuando ya no sea necesario (en el evento Unload del formulario, por ejemplo) utilizando la función UnregisterDeviceNotification. Código: Declare Function RegisterDeviceNotification Lib "user32" Alias "RegisterDeviceNotificationA" (ByVal hRecipient As Long, ByVal NotificationFilter As Long, ByVal Flags As Long) As Long Son bastante sencillas de usar, pero para este caso no nos van a servir. Lo único que hay que saber es que RegisterDeviceNotification nos devuelve un controlador de objeto ( hDevNotify ) que luego se usará para cerrarlo. También dejo las constantes que usan estas funciones: Código: ' El resto de la explicación es común para los dos métodos expuse anteriormente. Ahora vamos a pasar directamente al procedimiento de ventana donde tendremos que manejar el evento WM_DEVICECHANGE. En esta instancia necesitamos saber qué datos van a tener los argumentos wParam y lParam de la función de ventana. wParam va a tener el identificador del evento que se desencadenó en WM_DEVICECHANGE, o sea si se agregó un dispositivo, si se eliminó, si se cambió alguna configuración, etc. En nuestro caso, como no usamos RegisterDeviceNotification, los eventos que se van a desencadenar son sólo DBT_DEVICEARRIVAL y DBT_DEVICEREMOVECOMPLETE, a continuación pongo las constantes que identifican a todos los eventos: Código: ' lParam va a contener la dirección de una estructura que va a dar datos sobre el evento. La estructura se llama DEV_BROADCAST_HDR y es la siguiente: Código: Type DEV_BROADCAST_HDR Lo único que nos interesa de esta estructura es el registro dbch_devicetype que va a indicarnos qué tipo de dispositivo desencadenó el evento. Los posibles valores para este registro son los mismos que se usan en la llamada a RegisterDeviceNotification: Código: ' En el caso que sea un dispositivo de almacenamiento USB el registro tendrá el valor de DBT_DEVTYP_VOLUME. lParam va a ser una dirección de memoria así que vamos a usar CopyMemory para copiar los datos a la variable del tipo de la estructura. Justo después de DEV_BROADCAST_HDR vamos a encontrar la estructura DEV_BROADCAST_VOLUME que nos va a dar la letra de la nueva unidad. Código: Type DEV_BROADCAST_VOLUME Lo que nos va a interesar de esta estructura es el registro dbcv_unitmask. Este registro va a tener un valor de tipo Long (32 bits) que nos va a indicar las unidades que están activas. Si un bit está en 1 significa que esa unidad está usada. La siguiente función devuelve cuál fue la última unidad que se creó: Código: Function GetDriveFromMask(ByVal unitmask As Long) As String Y por último la función de ventana con todo lo que expliqué anteriormente. Código:
Bueh, espero que sirva. Título: Re: iniciar programa al meter mem_usb Publicado por: Anteros en 14 Noviembre 2006, 21:05 pm pucha como q no entendi bien del todo tendre q estudiarlo mas :P aunq ta un poco complicado ... la idea q tengo es q el programa una vez ejecutado se haga un servicio de win y q se localize en el systemtray y q este constantemente monitoreando si se a metido una mem_usb ::) y q de acuerdo a eso(si encuentra una usb) se ejecute una rutina ...
Título: Re: iniciar programa al meter mem_usb Publicado por: xDie en 14 Noviembre 2006, 22:00 pm pucha como q no entendi bien del todo tendre q estudiarlo mas :P aunq ta un poco complicado ... la idea q tengo es q el programa una vez ejecutado se haga un servicio de win y q se localize en el systemtray y q este constantemente monitoreando si se a metido una mem_usb ::) y q de acuerdo a eso(si encuentra una usb) se ejecute una rutina ... Lo puedes hacer con un timer mas facilCódigo: Private Sub Timer1_Timer() Pero el ejempleo anterior es el mejor :) Título: Re: iniciar programa al meter mem_usb Publicado por: Anteros en 14 Noviembre 2006, 22:07 pm un timer... buena idea!!! asi este el app como servicio el timer sigue funcionando?
porq filecopy???? uhmmm mejor otro proceso q me diga si existe la unidad algo asi como Si dir$(unidadUSb)<>"" entonces hacer procedimientos correspondients..estoy en lo correcto? se puede hacer eso del dir para una unidad? o solo es para archivos? ...un timer buena idea!!! Título: Re: iniciar programa al meter mem_usb Publicado por: jrhomer en 29 Diciembre 2006, 10:13 am Intento subir este hilo ya que me ha surgido una duda muy parecida al planteamiento inicial.
En mi casa he creado una sencilla aplicación la cual se ejecuta al iniciarse windows y pone en ejecución una aplicación, en este caso es el conocido "BitComet.exe". Lo que sucede es que mis descargas las hago a un HD que tengo en una caja conectado por USB al pc... (osea lo que sería un HD portatil o como lo querais llamar). Por lo tanto solo me interesa que se ejecute BitComet si sabemos que está en funcionamiento el HD por USB. Puede que lo tengamos conectado por USB pero que no esté conectado a la corriente eléctrica (por lo tanto no funciona) y al reves... que esté conectado a la corriente elétrica pero que no lo esté por USB.... eso es lo de menos, ya que, lo que interesa es saber si está conectado al PC y de ese modo poder ejecutar el BitComet para que comiencen automáticamente las descargas. Esto lo hago para que el usuario de ese momento del PC "no se de cuenta" de que está el BitComet en ejecución. La ejecución del proceso del BitComet la hago de un modo invisible, para que al menos no lo note a la vista. (se que este usuario no se va a ir a la lista de procesos para que es lo que le quita "un poquito" de velocidad mientras navega.) He pensado (en lo mas facil), comprobar si existe una ruta que esté en el HD por USB.... pero eso podria no funcionar el el momento que se cambie el nombre de la unidad.... tb he pensado en ir haciendo un recorrido con un for... con las letras del abecedario (jejeje) y que en cada momento compruebe el número de serie de ese disco duro... y en el momento que de con el número de serie del disco conectado por USB que inicie la ejecución de BitComet. Que os parece? ¿Cómo podemos abordar esta situación? un saludo. Título: Re: iniciar programa al meter mem_usb Publicado por: Anteros en 29 Diciembre 2006, 17:52 pm Holas yo hice... lo sgte:
Al prog le meti un timer con interval de 1000 y q este revisando cada vez q se meta un dispositivo USB con la ayuda de la api GETDRIVETYPE ...mira aca te pongo un poco de codigo: Código:
recuerda q este codigo se seguira ejecuntado aun si ya se metio un dispositivo USB tendras q hacer lo necesario para q una vez metido el dispositivo q quieres el timer se desabilite ya q el app seguira consumiendo mem cualquier duda pregunta ... estamos todos para ayudarnos si estoy mal en algo seria bueno q la gente nos lo haga saber suerte!!! Título: Re: iniciar programa al meter mem_usb Publicado por: Sancho.Mazorka en 29 Diciembre 2006, 22:40 pm Nymphetaminito muy buena INFO, a muchos nos servira incluyendome! tmb se puede hacer algo asi pero en vez de con una memoria al conectar un celular o al colocar algun otro dispositivo?
Gracias y salu2 ;D Título: Re: iniciar programa al meter mem_usb Publicado por: Anteros en 30 Diciembre 2006, 17:21 pm creo q GETDRIVETYPE reconoce cualquier dispositivo USB q se conecte a la PC
Título: Re: iniciar programa al meter mem_usb Publicado por: Sancho.Mazorka en 31 Diciembre 2006, 22:15 pm Nymphetaminito donde conseguiste toda esa info ?
Sere tan boludo que nunca encuentro cosas asi... :( y las busco, pero no encuentro Ese codigo ( el procedimiento ) que pusiste tiene que estar controlado x un timer no ? Anteros GETDRIVETYPE no creo que reconzoca solo los USB, reconoce todo tipo de DRIVES Me olvidaba si conecto una WebCam solo me va a servir el metodo que posteo Nymphetaminito ? xq Windows no lo reconoce como DRIVE... Salu2 y espero una respuesta! Sancho.Mazorka :P Título: Re: iniciar programa al meter mem_usb Publicado por: Anteros en 2 Enero 2007, 03:16 am ...es verdad GETDRIVETYPE reconoce todos los drivers la opcion 2 es la q reconoce los q son _USB :D :rolleyes:
Título: Re: iniciar programa al meter mem_usb Publicado por: Sancho.Mazorka en 2 Enero 2007, 03:57 am Anteros cuidado con lo que dijiste...
Yo dije "Reconoce Los DRIVES" no "DRIVERS" DRIVE: puede ser como C:\ , G:\ , son unidades como la disketera, disco rigido, lectora. DRIVERS: Es un programa que permite interactuar al SO con un periferico, osea el protocolo de comunicacion del periferico. Sancho.Mazorka :P Título: Re: iniciar programa al meter mem_usb Publicado por: Anteros en 2 Enero 2007, 15:02 pm ... plop! :rolleyes: tenes razon ;D
debio ser los rezagos de la resaca de año nuevo :P :P ;) mil disculpas... son Drives Título: Re: iniciar programa al meter mem_usb Publicado por: Sancho.Mazorka en 2 Enero 2007, 19:57 pm Obvio a todos la resaca nos deja medio tirados xD
Sancho.Mazorka :P |