Utilizar APIs de Windows en VBScript

Iniciado por CrowDat, 25 Abril 2007, 00:23 AM

0 Miembros y 1 Visitante están viendo este tema.

CrowDat

Buenas, no se si aqui es el lugar adecuado para postear esto, pero creo que le puede ir bien a muchos admins que utilizen vbs en el trabajo, o simplemente para scripts para uso personal.

Hice un script .hta (vbs+html) que mostraba info de la caducidad del password, para que una vez quedaran solo un par de dias de vigencia al pwd estuviera siempre visible un aviso, es decir, un aviso que estuviera "always on top", el caso es que ni el motor que procesa los vbs (wscript/cscript) ni el de los hta (mshta.exe) tenian esta opcion de ningún modo.

Para poner una aplicación always on top hay que invocar las APIs de Windows y mediante vbs parece ser que tampoco se puede.. o eso creia..

Buscando en cientos de foros, veo que todos afirman que solo es posible con terceros programas (powermenu, autoit, etc) donde hay que instalar el programa, o crear un activex e instalarlo, o tener un exe hecho en VB aparte del script donde se declara la funcion de la API para que haga la función deseada y luego invocarlo..

En definitiva es bastante engorroso y pierde en parte su utilidad el script si depende de otro programa.

Pues segun parece hay una manera mucho más simple y que se puede hacer desde el propio script, sin tener que instalar ningún programa ni depender de un .exe por ahi suelto (bueno en cierto modo si..) pudiendo asi usar todas las APIs y darle mucha mas potencia a nuestros scripts.

El truco es tan simple como invocar al Excel (es decir, dependemos de tener el Office instalado) y pasarle una macro desde el script que invocará la API que queramos.

Para mi, en una plataforma típica de PCs Windows XP + Office 2003 el script me va perfecto sin tener que depender de ningun programa (salvo el excel) ni instalar nada adicional de lo que ya había.

Ejemplo:

Set Application=CreateObject("Excel.Application")
hwnd=Application.ExecuteExcel4Macro("CALL(""user32"",""FindWindowA"",""JJC"",0,""Calculadora"")")
RC=Application.ExecuteExcel4Macro("CALL(""user32"",""SetWindowPos"",""JJJJJJJJ""," & hwnd & ",-1,0,0,0,0,3)")


Ejecutar calc.exe y luego ejecutar el script.
Una vez ejecutado quedará "always on top" la calculadora hasta que se cierre.

Este truquito lo he encontrado en un blog japonés sobre scripting.

http://scripting.cocolog-nifty.com/blog/2007/02/win32apicall_b558.html

Saludos

Novlucker

#1
Esta bien, va aqui.... Ahora , me deja una duda... que pasa si tienes dos calculadoras corriendo?? cual que da "Always On Top"?  :huh:

Porque si no se puede dejar una en particular, entonces conozco otra manera en al que se puede hacer esto.....  ;)

Salu2

Modifico:Igual imagino que lo que querias dar a entender es que se puede acceder a las API's de win con vbs
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

sirdarckcat

Hola
pues de hecho si se puede con javascript (y tambien con vbscript) pero seria muy molesto para el usuario xD
seria simplemente un evento
onblur="focus()"


Novlucker

Claro, sin lugar a dudas el metodo de CrowDat es el mejor si se quiere hacer esto.. el unico problema es depender de excel.... muchas personas usan openoffice por ej... pero igual esta interesante la manera de acceder a las API's de win


salu2
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

CrowDat

Cita de: Sirdarckcat en 25 Abril 2007, 14:46 PM
Hola
pues de hecho si se puede con javascript (y tambien con vbscript) pero seria muy molesto para el usuario xD
seria simplemente un evento
onblur="focus()"

Yo estuve buscando y habia conseguido muchas maneras de hacer que una ventana se quede por encima de otras, pero dentro de la misma aplicacion (por ejemplo cualquier navegador), pero solo con pulsar sobre otro programa, la aplicación pierde el foco o como mucho parpadea en la barra de tareas, pero no es tal cual "always on top" por encima de cualquier programa.

He probado con el codigo que citas y con varias variantes más y no me da el efecto deseado.

Por otra parte, tal como decia, para mi el logro no es solo poder ponerlo on top,sino el poder llamar apis de windows desde vbs sin instalar programas ni nada externo salvo el office.

Saludos!