Página 1 de 1

¡AYUDA! Problema carga de variables en memoria

Publicado: 03 Mar 2010, 13:32
por Pickart
Ante todo un saludo para todos.

Soy un aficionado del autoit, y se me ha presentado este problema a la hora de gestionar variables.
Esto es una aplicación de prueba.

Mi intención es cargar en memoria el valor que le introduces en la casilla de entrada, por ejemplo una letra que quieres que escriba en un .txt

El problema que me encuentro es que me escribe ceros, en vez de la letra que le ponga en el campo de entrada y no soy capaz de descubrir porque, no sé si tengo todo planteado mal o si declaro mal las variables o un se xD. :smt021

Si alguien me pudiera echar una mano lo agradecería.

MODO DE USAR LA APLICACIÓN:

-Genera en el escritorio un txt con el siguiente nombre: juas.txt y dejarlo abierto
-Ejecutar la aplicación, asignar una tecla y pulsar iniciar
- con F10 tendría que empezar a escribir la letra que as introducido cada 1 segundo.
-con F9 se detiene la escritura.
-con Alt+F9 sales al menú de entrada y puedes poner otra letra.

Bueno eso es lo que intento que haga esta práctica pero solo consigo que escriba ceros

Os dejo aqui el codigo:

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $tecla1

Opt('MustDeclareVars', 1)

INICIO()

Func INICIO()
	Local $filemenu, $fileitem, $recentfilesmenu, $separator1
	Local $exititem, $helpmenu, $manual, $aboutitem, $okbutton
	;Local $tecla1
	Local $msg, $file
	#forceref $separator1

	GUICreate("2010", 300, 280)
	$filemenu = GUICtrlCreateMenu("Archivo")
	$separator1 = GUICtrlCreateMenuItem("", $filemenu)
	$exititem = GUICtrlCreateMenuItem("Salir", $filemenu)
	$helpmenu = GUICtrlCreateMenu("Ayuda")
	$manual = GUICtrlCreateMenuItem("Manual", $helpmenu)
	$aboutitem = GUICtrlCreateMenuItem("Acerca de", $helpmenu)
	GUICtrlCreateGroup("2010", 5, 5, 125, 140)
	GuiCtrlCreateLabel("Introduce la tecla que"& @CRLF &"quieres usar", 15, 30)

	GuiCtrlCreateLabel("Tecla:", 30, 82)
	$tecla1 = GuiCtrlCreateInput("v", 65, 80, 15, 20, $ES_CENTER)

	GUICtrlSetState(-1, $GUI_DROPACCEPTED)
	$okbutton = GUICtrlCreateButton("INICIAR", 50, 150, 200, 30)
	GuiCtrlCreatePic("", 0, 190, 300,68)
	GUISetState()

	While 1
		$msg = GUIGetMsg()
		Select
			Case $msg = $GUI_EVENT_CLOSE
				ExitLoop

			Case $msg = $exititem
				ExitLoop

			Case $msg = $okbutton
				GUIDelete()
				PAUSAR()

			Case $msg = $aboutitem
				MsgBox(0, "Acerca de", "2010")

		EndSelect
	WEnd

	Exit
EndFunc

PAUSAR()

Func FUNCION1()
	;Local $tecla1
	HotKeySet("{F9}", "Pausar")
	ToolTip("Pulsar: < Activo >", 0, 40)
	While 1
		ControlSend("juas.txt: Bloc de notas", "", "Edit1", GUICtrlRead($tecla1), 0)
		;ControlSend("juas.txt: Bloc de notas", "", "Edit1", "{v}", 0)
		Sleep(1000)
	WEnd
EndFunc

Func PAUSAR()
	;Global $Paused
	ToolTip("Pulsar: < Parado >", 0, 40)
	HotKeySet("!{F9}", "Inicio")
	HotKeySet("{F10}", "Funcion1")
	While 1
		Sleep(100)
	WEnd

EndFunc

Func SALIR()
	Exit
EndFunc
Un Saludo y gracias de antemano :smt039

Re: ¡AYUDA! Problema carga de variables en memoria

Publicado: 03 Mar 2010, 14:20
por Ximorro
Al principio creía que estabas haciendo un keylogger, pero parece que no...

Pues por ejemplo... ¿seguro que la ventana del Bloc de notas se llama así?
A mí por ejemplo me pone "juas.txt - Bloc de notas" fíjate que no es un ":" sino un "-". Quizás si tienes Vista u otro es diferente, yo tengo XP, pero mira a ver si es eso...

Si ejecuto directamente
ControlSend("juas.txt - Bloc de notas", "", "Edit1", "hola", 0)
funciona perfectamente.
Por cierto, veo en la línea comentada que mandabas un "{v}", las llaves son para las teclas especiales, para mandar simplemente la v mejor pon "v".

Si eso te va será que hay algún problema con el Input, aunque la verdad es que no veo nada raro... ah bueno, un momento, mira que cuando presionas OK el formulario es borrado con GUIDelete, con lo que $tecla1 ¡ya no existe!. Por eso te manda ceros, en realidad te está dando un error.
Para solucionarlo, lo que menos cambios requiere es que antes de ese GUIDelete te guardes lo que hay en el Input en una variable global, y que el ControlSend use esa variable.
Otra opción sería no borrar el formulario, sólo ocultarlo, pero entonces hay que cambiar la estructura para que no se cree cada vez que se ejecuta INICIO(), ahí sólo debería mostrarse, no crearse.

Re: ¡AYUDA! Problema carga de variables en memoria

Publicado: 03 Mar 2010, 16:56
por Nahuel
Ximorro tiene razón. Borrás el control antes de leerlo. Yo haría otro cambio:
Reemplazar

Código: Seleccionar todo

ControlSend("juas.txt: Bloc de notas", "", "Edit1", GUICtrlRead($tecla1), 0)
Por:

Código: Seleccionar todo

ControlSend("[CLASS:Notepad]", "", "[CLASS:Edit; INSTANCE:1]", GUICtrlRead($tecla1), 0)
De esa forma no dependés del título de la ventana.

Te hice las modificaciones que te dijo Ximorro, están marcadas con ;<=====

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $tecla1
Global $TeclaAEnviar  ;<=====================


Opt('MustDeclareVars', 1)

INICIO()

Func INICIO()
   Local $filemenu, $fileitem, $recentfilesmenu, $separator1
   Local $exititem, $helpmenu, $manual, $aboutitem, $okbutton
   ;Local $tecla1
   Local $msg, $file
   #forceref $separator1

   GUICreate("2010", 300, 280)
   $filemenu = GUICtrlCreateMenu("Archivo")
   $separator1 = GUICtrlCreateMenuItem("", $filemenu)
   $exititem = GUICtrlCreateMenuItem("Salir", $filemenu)
   $helpmenu = GUICtrlCreateMenu("Ayuda")
   $manual = GUICtrlCreateMenuItem("Manual", $helpmenu)
   $aboutitem = GUICtrlCreateMenuItem("Acerca de", $helpmenu)
   GUICtrlCreateGroup("2010", 5, 5, 125, 140)
   GuiCtrlCreateLabel("Introduce la tecla que"& @CRLF &"quieres usar", 15, 30)

   GuiCtrlCreateLabel("Tecla:", 30, 82)
   $tecla1 = GuiCtrlCreateInput("v", 65, 80, 15, 20, $ES_CENTER)

   GUICtrlSetState(-1, $GUI_DROPACCEPTED)
   $okbutton = GUICtrlCreateButton("INICIAR", 50, 150, 200, 30)
   GuiCtrlCreatePic("", 0, 190, 300,68)
   GUISetState()

   While 1
      $msg = GUIGetMsg()
      Select
         Case $msg = $GUI_EVENT_CLOSE
            ExitLoop

         Case $msg = $exititem
            ExitLoop

         Case $msg = $okbutton
            $TeclaAEnviar = GUICtrlRead($tecla1)  ;<=====================
			GUIDelete()
            PAUSAR()

         Case $msg = $aboutitem
            MsgBox(0, "Acerca de", "2010")

      EndSelect
   WEnd

   Exit
EndFunc

PAUSAR()

Func FUNCION1()
   ;Local $tecla1
   HotKeySet("{F9}", "Pausar")
   ToolTip("Pulsar: < Activo >", 0, 40)
   While 1
      ControlSend("[CLASS:Notepad]", "", "[CLASS:Edit; INSTANCE:1]", $TeclaAEnviar, 0)  ;<=====================
      ;ControlSend("juas.txt: Bloc de notas", "", "Edit1", GUICtrlRead($tecla1), 0)
      ;ControlSend("juas.txt: Bloc de notas", "", "Edit1", "{v}", 0)
      Sleep(1000)
   WEnd
EndFunc

Func PAUSAR()
   ;Global $Paused
   ToolTip("Pulsar: < Parado >", 0, 40)
   HotKeySet("!{F9}", "Inicio")
   HotKeySet("{F10}", "Funcion1")
   While 1
      Sleep(100)
   WEnd

EndFunc

Func SALIR()
   Exit
EndFunc

Re: ¡AYUDA! Problema carga de variables en memoria

Publicado: 03 Mar 2010, 21:20
por Pickart
Holas

Gracias Ximorro y Nahuel, duda resuelta. :smt023

No había caído en que al cerrar la UI se me borraba la variable, juer
Pues pruebo vuestras soluciones, experimento un poco y os comento.

Muchas gracias sois unos fenómenos :smt041