Página 1 de 1

Automatizar la instalación de los drivers del equipo

Publicado: 16 May 2010, 19:34
por Jonny
Hola

Estoy haciendo un programilla, que instale automáticamente los drivers del equipo, que préviamente he compilado en un .exe con Driver genius (me pareció la opción más fácil) para automatizar el proceso y que todo quedara bien instalado.

El programa está casi hecho, aunque con poco control de errores, por precisamente el problemilla que tengo, que es por el que os pido ayuda.

El programa generado por Driver genius, requiere de tan solo dos pasos para empezar a instalar los drivers. El primero y diría yo más complicado, lo tengo solventado gracias a este hilo
http://www.emesn.com/autoitforum/viewto ... tana#p6020
que encontré de casualidad, buscando como obtener los controles de una ventana externa al programa (que sigo sin saber como hacer).

Así pues, en lo que llevo de programa he conseguido comprobar medianamente que exista un ejecutable creado por driver genius, ejecutarlo, y completar el primer paso que consiste en recorrer todo el treeview donde figuran los drivers compilados, y verificar si están o no verificados. Si no lo están, marcar el checkbox correspondiente, de forma que todos queden marcados (para instalar todos los drivers) (en una futura versión más presentable podrán configurarse que drivers se instalarán y cuáles no). Y por último en este primer paso, se cliquea en el botón "Restaurar drivers".
El segundo paso, es el que me está dando un poco de problemas.
Quisiera comprobar el texto que aparece, donde el programa pregunta si se quieren restaurar realmente los drivers, para verificar que el proceso está siendo correcto, pero no hay forma. Esta ventana, que aparentemente cambia de nombre, no puedo obtener su información con el AutoIt Window info (no se por qué). Y por tanto no se como se llamará el control que obtiene ese texto. He probado con Label, Label1 etc, pero nada.
Tan solo he conseguido enviar un click a los botones "Sí" y "No".
Al hacer click en "Sí", se inicia la instalación de los controladores... (Y hasta aquí llega lo que he escrito de la aplicación.

Me gustaría ahora, que para terminarla medianamente bien (y poder terminarla en realidad), mé ayudárais con alguna cosilla.

¿Como se obtienen los controles de una ventana?
Me refiero a todos.... y ¿Como obtengo su contenido?
Porque por ejemplo, una vez completado los dos pasos que requieren la intervención del usuario, empiezan a instalarse los drivers, y aparece en la ventana del programa información respecto al progreso de la instalación (porcentaje, etc), pero diría, que no son labels donde aparece esa info.
¿Sabeis que controles son, y como acceder a ellos?
Eso sería muy importante, para controlar cuando termina la instalación de los controladores.... porque no se me ocurre otra forma de hacerlo.

Aquí os dejo un link de sendspace, donde he subido el código que he hecho hasta ahora, y el paquete de drivers que he compilado con Driver genius.
No lo adjunto en el foro porque los drivers ocupan demasiado:

http://www.sendspace.com/file/yy2ghh

Gracias por adelantado,

Salu2!

Re: Automatizar la instalación de los drivers del equipo

Publicado: 17 May 2010, 02:13
por Fredinchy
Hola!! Pues para revisar los controles de una ventana usamos Autoit Window Info.. lo puedes encontrar en Inicio/Programas/Autoit o en el editor Scite en el menú Tools se llama Au3Info..

Y con este programa vas a sacar la información de los controles que te sean necesarios..

Código: Seleccionar todo

ControlClick ( "Mi ventana", "", "[CLASS:Button; INSTANCE:1]")
Así le hago click a 'Mi ventana', con cualquier texto, en el boton de clase button instancia 1.. eso todo me lo dice el Autoit Window Info..

Saludos! :smt020

Re: Automatizar la instalación de los drivers del equipo

Publicado: 17 May 2010, 06:52
por Jonny
Hola

Como dige en el anterior mensaje, en el segundo paso de la instalación de los drivers no puedo obtener la info de los controles ni de la ventana con esa herramienta. Lo más, al pulsar en "No", en el windows info tools me aparece la info de la ventana del primer paso del instalador, pero eso ya puedo hacerlo desde esa misma ventana, No entiendo por qué en la segunda no.

Además, necesitaría obtener los controles de una ventana sin conocerlos de ante mano, para hacer un control de errores un poco depurado y también controlar de alguna forma cuando se termina la instalación de los drivers, porque basándome en tiempo es imposible, pues no tardará lo mismo en un ordenador que en otro, ni tampoco siempre contendrá el paquete los mismos drivers.... En definitiva, es imposible prácticamente que incluso siendo el mismo pc y el mismo paquete de drivers, tardara exactamente lo mismo cada vez que se ejecute la instalación.

salu2!

Re: Automatizar la instalación de los drivers del equipo

Publicado: 17 May 2010, 14:22
por Jonny
Hola

Pues nada ... Parece que he avanzado algo con este script, pero no mucho.

He conseguido leer el contenido del label del segundo paso del instalador de drivers. Por una de esas casualidades remotas, al windows info tools le ha dado por comportarse y decirme que no era label, sinó static jejeje.
así pues, ya he hecho que se capture el contenido de ese control y compruebe el texto. Si es la pregunta a si se quieren restaurar o no los controladores, se asume que todo va bien y se cliquea en "Sí", y aquí el problema...

Quisiera leer la barra de progreso que aparece mientras se instalan los drivers, pero no se como hacerlo... con el windows info tools no veo la clase de ese control. En esa ventana solo puedo ver la info de lo que según dice, es un sysview32 (el control donde aparece el controlador que se está instalando), pero de los demás, ni rastro.
¿Como puedo acceder a ellos?
Solo me quedaría comprobar que se haya terminado la instalación de los controladores, cliquear en "Finalizar" y reiniciar el sistema. En teoría poco y fácil... Pero no se como controlar la barra de progreso, que es lo que veo más fiable para comprobar si se ha terminado o no de instalar los drivers.

A ver si alguien tiene idea de como hacer esto.

Salu2!

Re: Automatizar la instalación de los drivers del equipo

Publicado: 17 May 2010, 22:50
por Fredinchy
Bueno no es la mejor solución que existe estoy seguro, pero como no puedes trabajar con controles no se me ocurre otra cosa.. puedes colocar la ventana en una posición exacta con WinMove() y luego con un pixel search chequeas por donde va la barra de progreso.. si sacas la posición exacta de la barra de progreso puedes obtener el valor exacto de la barra.. Aunque claro entonces hay que darle el foco a la ventana :smt017

Re: Automatizar la instalación de los drivers del equipo

Publicado: 18 May 2010, 01:16
por Chefito
No se como has mirado en el AutoIt Window Info, pero si aparece todo la información de los controles.

Para pulsar el botón de la ventana prueba con esto:

Código: Seleccionar todo

ControlClick("Installer","¿Desea restaurar los drivers ahora?","Button1","left",2)
Este tipo de ventanas emergentes a veces dan problemas al intentar pulsar sus botones. Al pulsar 2 o más veces no suele haber problemas, pero si te quieres asegurar, haz un bucle diciendo que mientras exista esta ventana pulse el botón. Muy facil :smt001 .

Y también te dice la clase de la barra de progreso (msctls_progress32). Prueba esto para que te vaya diciendo el porcentaje:

Código: Seleccionar todo

#Include <SendMessage.au3>
#include <ProgressConstants.au3>

$handle = ControlGetHandle ("Instalador de los drivers de Driver Genius", "", "[CLASS:msctls_progress32; INSTANCE:1]")
$msg = _SendMessage($handle,$PBM_GETPOS,0,0)
ConsoleWrite("Position: " & $msg & "%" & @CRLF)
Mira las constantes que tiene la librería ProgressConstants.au3 que puede que te sean de ayuda.

Saludos.

Re: Automatizar la instalación de los drivers del equipo

Publicado: 18 May 2010, 07:01
por Jonny
Hola

Gracias...

Vaya... Pues ¿Como se mira con el windows info tools?...

Ya te digo, que a mí la barra de progreso ni por asomo, igual que el resto de controles, salvo los botones que los acabé manejando bien.

Ui, tendré que pararme a hechar un vistazo a las dos librerías que utilizas, sobre todo a SendMessage.au3, que nunca la he utilizado y no se para que servirá siquiera...
Miraré también las constantes de Progressconstants.au3 como dices, a ver que encuentro.

Y para hacerlo un poco más rebuscado:
¿Podría trabajarse con este programa ocultando la ventana?

Si has visto el código que colgué, verás que intento ejecutar el instalador de los drivers oculto, pero la ventana se ve de todas formas.
No es que sea inprescindible ocultarla, pero creo que quedaría mejor que ver como el programa trabaja solo, como si el pc tuviera un fantasma xd.
Imagino en todo caso, que con la ventana oculta quizá no se puedan manipular los controles...

De poderse, haría mi propia interfaz.

Salu2!

Re: Automatizar la instalación de los drivers del equipo

Publicado: 18 May 2010, 08:22
por Ximorro
Jonny lo de la Window Info Tools igual es por la versión, con las nuevas versiones de AutoIt también han mejorado esa herramienta. Leí que era principalmente para que diera más información de los controles toolbar pero quizás haya otras mejoras.

Así que si tienes una versión anterior, por ejemplo la de AutoIt 3.3.0, puede que no te dé tanta información.
Si no quieres actualizar AutoIT todavía igual te puede servir que te pasen únicamente el archivo Au3Info.exe de la 3.3.6, creo que es autónomo.

Re: Automatizar la instalación de los drivers del equipo

Publicado: 18 May 2010, 12:11
por Jonny
uyy....

¡Me parece que me he quedao atrás!
Yo tengo la versión 3.3.0.0 de AutoIt, pensaba que lo actualizaban cosa de una vez al año, por allá por diciembre o así (es cuando he solido ver yo nuevas versiones), por lo que ni se me había ocurrido mirar como andaba el tema.
De todas formas, efectivamente, utilizo el windows info tools de una versión ya un poco vieja. la 3.2.12.1.1, o algo así, porque la que incluye el autoit 3.3.0.0 me daba más problemas aún.

Sí, es independiente, pero siempre será mejor actualizar el autoit entero ¿no? algo de interesante llevará...

De todas formas, aún no se como obtener los controles de una ventana sin conocerlos con el windows info tools (me hará falta para cuando quiera ampliar el programilla) y que haga cosas más complejas.
Acias.

Salu2!

Re: Automatizar la instalación de los drivers del equipo

Publicado: 18 May 2010, 20:08
por Fredinchy
Revisa el History/Change Log en la ayuda justo antes de las udf's después de descargar la última versión del Autoit..

Saludos :smt020

Re: Automatizar la instalación de los drivers del equipo

Publicado: 19 May 2010, 12:18
por Chefito
Jonny escribió:De todas formas, efectivamente, utilizo el windows info tools de una versión ya un poco vieja. la 3.2.12.1.1, o algo así, porque la que incluye el autoit 3.3.0.0 me daba más problemas aún.
Yo utilicé el windows info tuyo y me dió los controles sin problemas.
Simplemente para que te de los valores de los controles que tu quieras, pon el cursor del ratón encima del control y ya está. Lo que pasa que si lo mueves y por casualidad va a otro objeto, te va a cambiar todos los valores anteriores y te va a poner los del nuevo objeto señalado.
Otra forma que tienes, es arrastrar el punto de mira que tiene hacia el control. Esto es más preciso porque te lo recuatra en negrita y todo :smt002 .
Jonny escribió:De todas formas, aún no se como obtener los controles de una ventana sin conocerlos con el windows info tools (me hará falta para cuando quiera ampliar el programilla) y que haga cosas más complejas.
Para hacer eso irremediablemente tienes que utilizar apis. Para ser más exactos la api EnumChildWindows. Para que lo entienda y hablando a groso modo, esta api te enumera todos los controles hijos que tiene una ventana (madre).
En AutoIt no está implementada. Por fortuna en el foro ingles sí. Además tiene buenos ejemplos que te servirán de ayuda. Haciendo una búsqueda de la api he encontrado estos dos códigos que te solucionan el problema (tienes que adaptarlo minimamente a lo que tú quieres):
http://www.autoitscript.com/forum/index ... ntry797326
http://www.autoitscript.com/forum/index ... ntry786995

Saludos.

Re: Automatizar la instalación de los drivers del equipo

Publicado: 19 May 2010, 13:18
por Jonny
Hola

jajaja, ¿Como me lo montaré que casi siempre acabo liao con las apis, con lo mal que nos llevamos?.
Enfín, miraré los dos códigos, y si es poca cosa lo que hay que adaptar, pues estoy de suerte, e intentaré entenderlo/implementarlo xd.

A ver si me das una pista:
¿Esa api que devuelve? ¿El handle, la clase?...

Imagino, que la clase, de ser así, debería poder conocer también el instance, igual que con el window info tools ¿verdad? Por aquello de que pudieran haber más de un label, button o el control que fuera.

Salu2!

Re: Automatizar la instalación de los drivers del equipo

Publicado: 26 May 2010, 21:53
por Jonny
Hola

Descargué el código que encontró Chefito, para obtener los controles de una ventana:
http://www.autoitscript.com/forum/index ... ntry786995

Lo he probado con el instalador de drivers de Driver Genius, que era para lo que lo necesitaba como decía en este hilo.
Los controles los obtengo bien, pero no se como obtener el instance, como lo hace el windows info tools, que te dice la clase del control y el instance (1, 2, ...). He buscado por Google, pero no he encontrado nada ¿Puede obtenerse el instance con EnumChildWindows?.

El código (prácticamente sin modificar) es este:

Código: Seleccionar todo

#Include <WinAPI.au3>
$HDllCall=DllOpen("User32.dll")
;Run("Notepad.exe")
WinWait("Instalador de los drivers de Driver Genius")
$HParent=WinGetHandle("Instalador de los drivers de Driver Genius")
$Handle=DllCallBackRegister("_EnumChildWindowsProc", "int", "hwnd;lparam")
DllCall($HDllCall, "BOOL", "EnumChildWindows", "HWND", $HParent, "ptr", DllCallBackGetPtr($Handle), "LPARAM", 0)
Global $HlpCLassName
Func _EnumChildWindowsProc($hWnd, $lParam)
Local $HlpCLassName
$HControlID=DllCall($HDllCall, "int", "GetDlgCtrlID", "HWND", $hWnd)
$HClassName=DllCall($HDllCall, "int", "GetClassNameW", "hwnd", $hWnd, "wstr", "", "int", 4096)
$HWinAPIClassName=_WinAPI_GetClassName($hWnd)
MsgBox(0, "", "$hWnd="&$hWnd&@CR&"$hControlID = "&$hControlID[0]&@CR&"my $ClassName = "&$HClassName[2]&@CR&"_WinAPI_GetClassName = "&$HWinAPIClassName)
Return 1
EndFunc
DllClose($HDllCall)
Acias,

Salu2!

Re: Automatizar la instalación de los drivers del equipo

Publicado: 27 May 2010, 01:19
por Chefito
Pero si en ese código están las apis para hacer lo que dices. Lo único que no está es la instancia del control, pero si te da el ID, y con este identificativo se puede trabajar con las funciones control..... de autoit, si es eso lo que quieres.
En AutoIt están definidas:
_WinAPI_GetDlgCtrlID($hWnd) -> da el ID del control.
_WinAPI_GetClassName($hWnd) -> da el nombre de la clase del control.

Saludos.

Re: Automatizar la instalación de los drivers del equipo

Publicado: 27 May 2010, 06:58
por Jonny
Hola

Sí, sí, eso sí lo he visto, pero quería la instancia del control, para referirme a un control en concreto, cuando hubieran varios de la misma clase, de la forma: "Static1", pero tienes razón, puedo hacerlo con el handle. Aunque, mirando la ayuda veo que dice:
Cada control estándar de Microsoft tiene un "nombre de clase" como "botón" o "editor". En AutoIt éste se combina con la asignación de una "instancia" propia para cada control, dado su método "NombreDeClaseNN". Si usted visualiza una ventana con unos pocos botones contenidos en la misma, a ellos se referirá entonces como "Botón1", "Botón2", "Botón3", etc.

Este método es muy útil cuando el ID del control no puede emplearse (como texto estático y controles personalizados).

Entiendo, que se refiere a que ¿en los labels, no hay Handles?
Y que en controles personalizados, como creo que pueden hacerse en Java, tampoco.
¿Como podría hacer referencia a un label concreto si hubiera más de uno en una ventana y no obtuviera el handle, o a un control personalizado?
Porque supongo que el código que puse para listar los controles de una ventana, no dará información sobre controles que no sean de Microsoft ¿Verdad?

Salu2!

Re: Automatizar la instalación de los drivers del equipo

Publicado: 27 May 2010, 09:13
por Ximorro
Si son controles estándar de M$ seguro que tienen un handle, y también una clase e instancia. Además si son controles M$ seguro que los puedes ver con la herramienta Au3Info, aunque luego tengas que programarlo eso te puede servir para ver qué está pasando.
Por cierto, Au3Info te da tanto el handle como clase+instancia, pero ten en cuenta que el handle puede cambiar en cada ejecución, en cambio lo otro es fijo.

Con controles no estándar (java, flash) la cosa es muy complicada, porque son controles como si dijéramos "dibujados a pelo" y efectivamente la API de Windows no puede ayudarte a encontrarlos...

Re: Automatizar la instalación de los drivers del equipo

Publicado: 27 May 2010, 12:41
por Jonny
Hola

Sí, algo así tenía entendido, por lo que imagino, que sería pelearse con la pared.

sí, por eso quería obtener la instancia del control, por lo de que el handle va cambiando, aunque haciendo una función algo más elaborada, pues puede obtenerse el handle cada vez que se necesite.

Este código de las apis, es para casos en los que quisiera acceder a un control que no conociera de una ventana directamente. En este caso sí, es más sencillo usar el windows info tools.

Salu2!

Re: Automatizar la instalación de los drivers del equipo

Publicado: 28 May 2010, 22:09
por Jonny
Hola

Estaba casi acabando de escribir el autoinstalador de drivers, iba por la parte que comprueba la barra de progreso de la instalación para comprobar cuando termina el proceso, con el código que puso cchefito.

Código: Seleccionar todo

#Include <SendMessage.au3>
#include <ProgressConstants.au3>

$handle = ControlGetHandle ("Instalador de los drivers de Driver Genius", "", "[CLASS:msctls_progress32; INSTANCE:1]")
$msg=_SendMessage($handle,$PBM_GETPOS,0,0)
Msgbox(0, "", $msg&"%.")


Con esto, sí que obtengo un porcentaje, pero resulta, que no se corresponde con el de la barra de progreso del paquete de instalación de drivers de Driver Genius. Empieza bien, y por el 3% más o menos, empieza a no coincidir, mostrando un porcentaje mayor mi programa que el paquete de instalación de drivers. Al principio empieza con una diferencia de un 1% pero al final acaba con una diferencia de 12%.

He intentado controlarlo con algo como esto:

Código: Seleccionar todo

Global $BuffPercentProgress
$HandleProgressVar=ControlGetHandle("Instalador de los drivers de Driver Genius", "", "[CLASS:msctls_progress32; INSTANCE:1]")
$SendMsgProgressVar=_SendMessage($HandleProgressVar, $PBM_GETPOS, 0, 0)
While 1
If $SendMsgProgressVar==100 Then
ConsoleWrite("100%. ¡Finalizado!")
ExitLoop
EndIf
If $SendMsgProgressVar<>$BuffPercentProgress Then
$BuffPercentProgress=$SendMsgProgressVar
ConsoleWrite($SendMsgProgressVar&"%.")
ContinueLoop
Else
ContinueLoop
EndIf
Wend
No se si a vosotros os funcionará, a mí almenos no....

Salu2!