elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [BATCH] Mover el cursor a cualquier posición sólo con ECHO
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [BATCH] Mover el cursor a cualquier posición sólo con ECHO  (Leído 3,590 veces)
.xAk.


Desconectado Desconectado

Mensajes: 397


F0r3v3R NeWbI3


Ver Perfil WWW
[BATCH] Mover el cursor a cualquier posición sólo con ECHO
« en: 19 Febrero 2022, 09:36 am »

de esas cosas muy interesantes (fuente)

Este tema se basa en un comportamiento extraño (lo llamaría un error) que ocurre cuando TAB (ASCII char 9) se combina con BS (ASCII char 8) en los comandos ECHO o SET /P.

Cuando se muestra un carácter TAB en la pantalla, el controlador de pantalla de Windows lo traduce a una serie de espacios en blanco (generalmente 8 ), por lo que en este caso el TAB es destructivo: cualquier texto que se muestra previamente en la pantalla se sobrescribe con los espacios cuando se muestra TAB.

El número de espacios varía según la posición del cursor cuando se muestra el TAB, por lo que la posición final del cursor después de los espacios siempre es múltiplo de 8. Por ejemplo, si el cursor está en la primera columna de una línea, se muestra un TAB como 8 espacios, pero si el cursor está en la columna 1, el TAB se muestra como 7 espacios, etc.

Un comportamiento que puede parecer lógico en un principio es que un carácter de BS que se muestra después del TAB mueve el cursor hacia atrás la misma cantidad de espacios que muestra el TAB, es decir, la BS elimina la acción del TAB. Lo que en mi humilde opinión es un error es que otra BS que se muestra después de la primera también mueve el cursor hacia atrás la misma cantidad de espacios y, si el cursor alcanza el margen izquierdo de la pantalla, el cursor se desplaza hasta el final de la línea de pantalla anterior. !

Por ejemplo, si el cursor está en la primera columna de una línea, una secuencia de caracteres <TAB><BS><BS> mueve el cursor una línea arriba y 7 columnas a la izquierda del margen derecho de la pantalla. Si la pantalla tiene 80 caracteres de ancho, cada grupo adicional de 10 caracteres BS mueve el cursor una línea más. Después de eso, cada carácter BS adicional mueve el cursor 8 caracteres más a la izquierda en la misma línea. Finalmente, si se muestra otro carácter estándar único, los siguientes caracteres BS moverán el cursor solo un carácter a la izquierda.

De esta manera, el cursor se puede colocar en cualquier línea y columna anterior en la pantalla simplemente calculando el número adecuado de caracteres BS para mostrar después de una TAB y después de un carácter estándar adicional. Si la posición deseada está por debajo de la posición actual del cursor, primero coloque el cursor en la parte inferior de la pantalla a través de varios comandos ECHO/, y luego mueva el cursor hacia arriba y hacia la izquierda hasta la ubicación deseada con este método.

El archivo por lotes a continuación es un ejemplo del procedimiento anterior. El cálculo de la cantidad de caracteres BS y el comando ECHO es realmente simple y se puede agregar a cualquier programa de una manera muy simple, pero este programa es grande y complejo porque muestra una pantalla llena de coordenadas y permite ingresar la posición. de varias marcas, que se mostrarán en la pantalla en las posiciones adecuadas.


Código
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3.  
  4. echo Enter coordinates in line,col order to move the cursor and show a mark
  5. echo The valid ranges are:   0 ^<= line ^<= 30   and   0 ^<= column ^<= 71;
  6. echo if a value is out of range, the bell will ring.
  7.  
  8. rem Get a BEL, BS and a TAB characters
  9. set "BEL="
  10. for /F %%a in ('echo prompt $H ^| cmd') do set "BS=%%a"
  11. set "TAB="
  12. rem First, try the method for Windows XP
  13. for /F "skip=4 delims=pR tokens=2" %%a in ('reg query hkcu\environment /v temp' ) do set "TAB=%%a"
  14. rem Then, the method for newer versions
  15. rem http://www.dostips.com/forum/viewtopic.php?f=3&t=1733&p=6840#p6853
  16. for /F "tokens=2 delims=0" %%a in ('shutdown /? ^| findstr /BC:E') do if not defined TAB set "TAB=%%a"
  17.  
  18. rem Get a string with 162 BS characters, the maximum used in this program
  19. set "BSs="
  20. for /L %%i in (1,1,162) do set "BSs=!BSs!!BS!"
  21.  
  22. mode 80,32
  23. set "line1="
  24. for /L %%i in (1,1,8) do set "line1=!line1!0123456789"
  25. set "line2="
  26. for /L %%i in (1,1,8) do set "line2=!line2!^!l^!         "
  27. set "line2=!line2:~0,-1!^!l^!"
  28. set "line3="
  29. for /L %%i in (1,1,8) do set "line3=!line3!^!l^! 2 4 6 8 "
  30. set "line3=!line3:~0,-1!^!l^!"
  31. set "twoORthree=23"
  32. < NUL (
  33.   for /L %%a in (1,1,3) do (
  34.      set /P "=%line1%" & set "l=1"
  35.      set /P "=%line2%" & set /A "l+=1"
  36.      for /L %%b in (1,1,4) do (
  37.         if %%a neq 2 (
  38.            set /P "=%line3%"
  39.         ) else if "!twoORthree:%% style="color: #448888;">b=!" equ "%twoORthree%" (
  40.            set /P "=%line3%"
  41.         ) else (
  42.            echo           %line3:~0,-15%
  43.         )
  44.         set /A "l+=1"
  45.         set /P "=%line2%" & set /A "l+=1"
  46.      )
  47.   )
  48.   set /P "=%line1:~0,-1%"
  49. )
  50.  
  51. rem Initialize cursor position at middle of screen, to read input there
  52. echo 9%TAB%!BSs!
  53. set "currLine=16"
  54.  
  55. set "letters=_ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  56. set "num=1"
  57.  
  58. :loop
  59. set "position="
  60. set /P "position=Enter line,col for mark !letters:~% style="color: #448888;">num%,1!:      !BSs:~0,5!"
  61. if not defined position goto end
  62.  
  63. for /F "tokens=1,2 delims=, " %%x in ("%position%") do set /A y=%%x, x=%%y, error=1
  64. if 0 leq %y% if %y% leq 30  if 0 leq %x% if %x% leq 71  set "error="
  65. if defined error (
  66.   echo %TAB%!BSs:~0,12!!BEL!
  67.   goto loop
  68. )
  69.  
  70. if %y% leq %currLine% (
  71.  
  72.    rem New position above: move cursor up and show point
  73.   call :MoveCursorupAndShow "(currLine-y-1)" x "!letters:~% style="color: #448888;">num%,1!(% style="color: #448888;">y%,%x%)"
  74.  
  75.    rem And move cursor down, back to original input line
  76.   set /A down=currLine-y-2, cntBSup+=10
  77.   for /L %%i in (1,1,!down!) do echo/
  78.   if !down! lss 0 for /F %%i in ("!cntBSup!") do echo %TAB%!BSs:~0,%% style="color: #448888;">i!
  79.  
  80. ) else (
  81.  
  82.    rem New position below: first, move cursor to last line
  83.   for /L %%i in (1,1,15) do echo/
  84.   rem Then, move cursor up and show point
  85.   call :MoveCursorupAndShow "(30-y)" x "!letters:~% style="color: #448888;">num%,1!(% style="color: #448888;">y%,%x%)"
  86.  
  87.    rem And move cursor up, back to original input line, using the same method
  88.   set /A down=30-y
  89.   for /L %%i in (1,1,!down!) do echo/
  90.   echo %TAB%!BSs!
  91.  
  92. )
  93.  
  94. set /A num+=1
  95. if %num% leq 26 goto loop
  96. :end
  97. cls
  98. goto :EOF
  99.  
  100.  
  101.  
  102. :MoveCursorupAndShow  Linesup  Column  "Text"
  103. set /A "cntBSup = 2 + 10 * %~1 + (9-(%2+6)/8), cntBSleft = 8-(%2+6)%%8"
  104. set "BSsLeft="
  105. if %cntBSleft% gtr 0 set "BSsLeft=_!BSs:~0,% style="color: #448888;">cntBSleft%!"
  106. echo %TAB%!BSs:~0,% style="color: #448888;">cntBSup%!!BSsLeft!% style="color: #448888;">~3
  107. exit /B

La siguiente imagen es un ejemplo de salida del código anterior después de que se mostraran 8 marcas en varias posiciones.



por @Antonio en dostips


En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Mover el cursor??
Programación Visual Basic
Badlands 2 2,064 Último mensaje 28 Agosto 2006, 21:34 pm
por Badlands
Detectar posición del cursor de texto
Programación Visual Basic
aaronduran2 7 8,450 Último mensaje 24 Julio 2008, 20:26 pm
por aaronduran2
posicion del cursor
Programación Visual Basic
aum 8 3,049 Último mensaje 1 Agosto 2008, 15:19 pm
por cobein
¿Cómo modificar la posición del cursor? En C.
Programación C/C++
TopoJunior 1 7,511 Último mensaje 5 Abril 2013, 21:14 pm
por Maik33
Mover cursor con visual basic
Scripting
daviddavo 6 6,808 Último mensaje 6 Abril 2015, 17:21 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines