Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: cyberalejo17 en 19 Abril 2014, 21:08 pm



Título: [BATCH] ¿Cómo ubicar la ventana en coordenadas específicas?
Publicado por: cyberalejo17 en 19 Abril 2014, 21:08 pm
Buenas tardes,

Estoy trabajando en un script de batch de Windows. Estoy buscando alguna forma de ubicar la ventana en una coordenada específica de la pantalla.

Se que se puede hacer modificando parámetro del registro, pero hace algún tiempo me pareció leer que se podía realizar utilizando un comando similar al de cambiar las dimensiones:

MODE CON COLS=40 LINES=5

No logro encontrar esa página web.

¿De casualidad alguien conoce cómo se podría realizar esto sin utilizar llamadas al registro?

Muchas gracias.


PD. Si a alguien le interesa, se trata de un script que automatiza la tarea de montar una partición cifrada de truecrypt modo portable de una memoria usb y abrir un baúl de contraseñas de keepass (que se encuentra dentro de la unidad cifrada). Todo funciona perfectamente.


Ya lo compartí a la comunidad.
Pueden encontrar el código en:
http://foro.elhacker.net/scripting/aporte_batch_automatizar_apertura_volumen_y_baul_cifrado-t412971.0.html;msg1936475

(http://puu.sh/8fe16.png)


Título: Re: [BATCH] ¿Cómo ubicar la ventana en coordenadas específicas?
Publicado por: Eleкtro en 20 Abril 2014, 10:53 am
Una aplicación CLI (CommandLine Interface) se trata de manera muy distinta que una aplicación GUI (Graphical User Interface), una app CLI no entiende de ventanas y no puedes tener el control del tamaño y posición desde la propia CMD o desde ninguna otra aplicación CLI (de forma nativa, sin usar APIs). De echo el comando 'Mode Con...' realmente no redimensiona la ventana, lo que hace es redimensionar el buffer.

Windows se encarga de detectar y ubicar las nuevas instancias que inicies de la CMD, y en las propiedades de la CMD (click derecho > propiedades > diseño) puedes modificar la posición por defecto de la ventana de la CMD, eso afectará a TODAS las nuevas instancias ...no a la actual, pero ojo, no confundir esto con todo lo que acabo de decir, no se puede tener control de la ventana desde una app CLI una vez este corriendo (sin usar APIs).

En fin, el valor por defecto lo puedes modificar en la siguiente clave:
Código:
[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
"WindowPosition"=dword:Valor

Es un valor DWORD, para asignarlo debes combinar un Lo-Word (posición X) y un Hi-Word (posición Y) para crear un valor Dword, es decir, combinar dos valores Int16 (Short) para asignar el valor Int32 (Integer) a la clave.

Si dejas el valor vacio, windows ubicará la CMd en la posición por defecto.

Para tener control de la ventana desde la propia consola deberías utilizar un lenguaje capacitado para usar la API de Windows, específicamente las funciones FindWindow y MoveWindow, y crear un loader básico en ese lenguaje que se encargue de iniciar tu Script .Bat, y seguídamente ubicar la CMD que este instancia.

Otra slaternativas más simples sería depender de aplicaciones CommandLine de terceros que ya manejan la WinAPI, como por ejemplo usando el parámetro /mov de la aplicación CMDOW.

Saludos.


Título: Re: [BATCH] ¿Cómo ubicar la ventana en coordenadas específicas?
Publicado por: cyberalejo17 en 21 Abril 2014, 05:15 am
Muchas gracias por tu respuesta.

Habían varias cosas que desconocía.

No me quiero complicar utilizando herramientas y lenguajes adicionales.
Por lo pronto creo que voy a dejar mi script tal y como está.
Para futuros desarrollos los voy a aplicar.


¿A propósito del script, que te parece?


Título: Re: [BATCH] ¿Cómo ubicar la ventana en coordenadas específicas?
Publicado por: Eleкtro en 21 Abril 2014, 06:09 am
¿A propósito del script, que te parece?

Pues, dejando a un lado las florituras (el diseño de los menus y tal) y centrándome en la parte importante que se debe tener más en cuenta, es decir, en el código, la forma en que lo has desarrollado, y su funcionalidad, debo decir que me parece un muy buen Script.

Para ser Batch lo hiciste bastante bien, con varios detalles y se nota que le pusiste empeño al hacerlo, está muy bien, lo que más puedo valorar del Script es que lo documentaste.

Por otro lado, no quiero ponerme a sacar muchos defectos (o mejoras) porque siempre puedo acabar sacando una docena de ellos xD, pero veamos... te comentaré algunos aspectos importantes a tener en cuenta:

1. En muchas ocasiones no haces uso de las comillas dobles para encerrar variables ni expresiones, así como tampoco haces ningún uso de los operadores de agrupación (), eso es una mala costumbre que debes corregir, ya que en ciertas circunstancias esto ocasionará errores indeseados, y también es una mejora a la sintaxis de tu Script y dará una mayor libertad si quieres concatenar instrucciones.

Por ejemplo, esta ruta que contiene espacios en el nombre:
Citar
Código:
set rutaTC=%programfiles%\TrueCrypt\TrueCrypt.exe
Correción:
Código:
set "rutaTC=%programfiles%\TrueCrypt\TrueCrypt.exe"

Y aquí:
Citar
Código:
if not exist "%letraTC%:\%rutaArchvoKP%" goto :MONTAR_RW_var2
Correción:
Código:
if not exist "%letraTC%:\%rutaArchvoKP%" (goto :MONTAR_RW_var2)


2. Esto quizás dependa más de gustos y del concepto que cada persona tenga sobre la organización, pero en mi opinión el código se puede organizarm mejor ...podrías separar los menus y otros mensajes, del código funcional, por ejemplo:

Código
  1. @Echo OFF
  2.  
  3. REM =====
  4. REM MENUS
  5. REM =====
  6.  
  7. :Menu1:: Menu con las opciones para montar unidad.
  8. echo  ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
  9. echo  º                                   Abrir USB                                    º
  10. echo  ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹
  11. echo  º                             º                                                  º
  12. echo  º TC Principal                º                                                  º
  13. echo  º  1) S¢lo lectura úúúúúúúúúúúº Monta la unidad principal en modo RO (defecto)   º
  14. echo  º  2) Escritura úúúúúúúúúúúúúúº Monta la unidad principal en modo RW             º
  15. echo  º                             º                                                  º
  16. echo  º                             º                                                  º
  17. echo  º Ba£l                        º                                                  º
  18. echo  º  3) Abrir ba£l úúúúúúúúúúúúúº Monta la unidad principal en modo RW e inicia el º
  19. echo  º                             º   ba£l de contrase¤as                            º
  20. echo  º                             º                                                  º
  21. echo  º                             º                                                  º
  22. echo  º                             º                                                  º
  23. echo  º                             º                                                  º
  24. echo  º Extras                      º                                                  º
  25. echo  º  4) Mostrar archivos ocultosº Mostrar las carpetas ocultas en la memoria       º
  26. echo  º                             º                                                  º
  27. echo  ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
  28. Goto :EOF
  29.  
  30. :Menu2:: Menu con las opciones para desmontar la unidad
  31. ...
  32. Goto:EOF
  33.  
  34. :Menu3:: Advierte el preligro de la ejecucion de attrib.
  35. ...
  36. Goto:EOF
  37.  
  38.  
  39. REM ==============
  40. REM CÓDIGO PRINCIPAL
  41. REM ==============
  42.  
  43.  
  44. REM Resto del código...
  45.  
  46. :MENU_NOT_EXIST
  47. cls
  48. Call :Menu1
  49. set var=1
  50. set /p var= Seleccione una opci¢n (1-4) [1]:
  51. if %var%==1 goto :MONTAR_RO
  52. if %var%==2 goto :MONTAR_RW
  53. if %var%==3 goto :MONTAR_RW
  54. if %var%==4 goto :MOSTRAR_ADVERTENCIA
  55. goto :eol
  56.  
  57. REM Resto del código...


3. Deberías reemplazar el comando 'Set /P' por el comando 'Choice' para evitar respuestas erroneas (1-4) (aunque las estés controlando de forma básica con una llamada a una etiqueta)

Código:
Choice /C "1234" /M "Seleccione una opci¢n"


Saludos.


Título: Re: [BATCH] ¿Cómo ubicar la ventana en coordenadas específicas?
Publicado por: cyberalejo17 en 27 Abril 2014, 05:08 am
Muchas gracias por tu comentario. Voy a realizar las modificaciones.

Ya le he cambiado varias cosas, entre esas las opciones de los menús.


Un pequeño comentario.

Al inicio del script, la parte de las variables, donde tu indicaste:
Código:
set rutaTC=%programfiles%\TrueCrypt\TrueCrypt.exe

Lo puse sin comillas ya que cuando se llama a la variable
Código:
echo "rutaTC"
echo "%programfiles%\TrueCrypt\TrueCrypt.exe"
Ya tiene las comillas.

Si se las pongo en la zona de las variables, al invocar la variable quedaría:
Código:
echo ""%programfiles%\TrueCrypt\TrueCrypt.exe""