Página 1 de 1

ayuda a novato con GUI

Publicado: 25 Oct 2011, 05:47
por grzn
como veran, mi idea es crear un exe que envie pulsaciones cada cierto tiempo, eso ya lo logre con una sola tecla, lo que me gustaria es, replicar eso, ejemplo: en el primer recuadro inserto la tecla "1" y tiempo de 2 segundos entre pulsacion, y en el recuadro dos pongo "2" y de tiempo 5 segundos entre cada una, y haciendo funcionar con el boton de inicio, ya que si tengo dos no me funciona, y aunque no ponga tecla en el primer recuadro, se envia 0 o alguna otra tecla, aqui pueden ver el codigo, es bastante sencillo, y esta de prueba en el bloc de notas, el codigo se cierra con la flecha hacia la derecha.



Código: Seleccionar todo

Global $Paused
HotKeySet("{º}", "TogglePause")
HotKeySet("{RIGHT}", "Terminate")


#include <GUIConstantsEx.au3>



GUICreate("Luvinia", 350, 500)



GUISetState(@SW_SHOW)



GUICtrlCreateLabel("primera ", 8, 10)
$key1 = "{f1}"
GUICtrlCreateLabel("Time", 8, 44)
$time1 = GUICtrlCreateInput("", 55, 40, 40)
$startbutton = GUICtrlCreateButton("Inicar", 55, 8, 40)

GUICtrlCreateLabel("segunda", 8, 75)
$key1 = "{f2}"
GUICtrlCreateLabel("Time", 8, 104)
$time2 = GUICtrlCreateInput("", 55, 100, 40)

$startbutton = GUICtrlCreateButton("Inicar", 55, 68, 40)








WinWaitActive("Sin título: Bloc de notas")
While 1

$msg = GUIGetMsg()

Select


Case $msg = $startbutton




$send1 = ("{1}")
$sleep1 = GUICtrlRead($time1)

$send2 = ("{2}")
$sleep2 = GUICtrlRead($time2)

While 1 
Send($send1)
Sleep($sleep1*100)

Send($send2)
Sleep($sleep2*100)

WEnd







Case $msg = $GUI_EVENT_CLOSE
GUIDelete()
ExitLoop



EndSelect


WEnd




Func TogglePause()
  $Paused = NOT $Paused
  While $Paused
    sleep(100)
    ToolTip('Script is "Paused"',0,0)
  WEnd
  ToolTip("")
EndFunc

Func Terminate()
  Exit 0
EndFunc

Re: ayuda a novato con GUI

Publicado: 25 Oct 2011, 09:24
por Ximorro
Vamos a ver, primero te digo dónde están los problemas de programación y luego veremos exactamente lo que quieres hacer con las teclas, que con eso me he liado un poco...

Para empezar el GUISetState(@SW_SHOW) debe estar DESPUÉS de crear los controles del GUI, si hicieras muchos se vería cómo se están dibujando, precisamente por eso la ventana se crea oculta, para que pongas los controles y cuando acabes hagas el SHOW.

Las variables $key1 no se utilizan, de todas maneras son un error porque la asignas dos veces.
Pero el verdadero problema está en $startbutton. No debes utilizar el mismo nombre para los dos botones porque una variable sólo guarda un valor, si la vuelves a asignar pierde el primero, así que $startbutton acaba siendo el segundo botón, y el primero queda inaccesible.
Tienen que tener diferente nombre.

Las variables $send son demasiado complicadas... entre llaves se ponen sólo teclas especiales, así que para la tecla 1 se pone "1", y no "{1}". Además los paréntesis son innecesarios, con todo esto
$send1 = ("{1}")
queda
$send1 = "1"
igual para $send2

Quizás por eso no te funcionaba el send, por las llaves, mira a ver.

A parte los tiempos están mal, Sleep funciona con milisegundos, así que si tienes segundos tienes que multiplicar por 1000, no por 100.

Re: ayuda a novato con GUI

Publicado: 25 Oct 2011, 13:28
por grzn
muchas gracias por responder y por la pronta ayuda, ok lo de las teclas al inicio esta era mi intencion


Imagen

en donde dice "primera" se pone la tecla que quiero enviar y en "time" cada cuanto tiempo se envie la tecla (quiero enviar pulsacion y no solamente texto, y quisiera saber si es posible enviar teclas especiales como F1), este es el codigo original con un solo boton:

Código: Seleccionar todo

GUICtrlCreateLabel("primera", 8, 10)
$key1 = GUICtrlCreateInput("", 45, 8, 40); aqui nos da el cuadro para escribir en "primera"
GUICtrlCreateLabel("Time", 8, 44)
$time1 = GUICtrlCreateInput("", 45, 40, 40)
$startbutton = GUICtrlCreateButton("Inicar", 95, 8, 40)

GUISetState(@SW_SHOW)

WinWaitActive("Sin título: Bloc de notas")



While 1
$msg = GUIGetMsg()

Select

Case $msg = $startbutton

$send1 = GUICtrlRead($key1); desde aqui se envia la tecla puesta en "primera"
$sleep1 = GUICtrlRead($time1)

While 1 
Send($send1)
Sleep($sleep1*1000)
WEnd

Case $msg = $GUI_EVENT_CLOSE
GUIDelete()
ExitLoop

EndSelect
WEnd

Re: ayuda a novato con GUI

Publicado: 26 Oct 2011, 08:35
por Ximorro
En el edit tienes que poner exactamente lo que pondrías en el comando Send (sin las comillas).
Si quieres enviar la tecla 1 pues pones 1, si quieres poner F1 eso es con llaves por ser código especial, tienes que poner {F1}. Para alt-a pues !a, y así todo.
Mira en la ayuda la función Send para ver todo lo que se puede enviar y cómo hay que especificarlo.

Por otro lado tienes un problema lógico, a menos que quieras que funcione así, claro, pero tal como está en cuanto apretes el botón entrará en un bucle infinito:

Código: Seleccionar todo

While 1
   Send($send1)
   Sleep($sleep1*1000)
WEnd
Así rápido se me ocurren tres maneras para solucionarlo (si es que quieres pararlo, se entiende):
1) Lanzar las teclas con funciones Adlib y poner otro botón en el GUI para parar.
2) Crear una función que lo pare activable con un hotkey
3) Usar el sistema de eventos OnEvent, para que puedan interrumpir el bucle.

Creo que lo más rápido será lo primero...

Otra cosa, un truco interesante para referenciar el bloc de notas y que sirva en todos los idiomas de Windows es usar su clase.
De hecho aunque yo también lo tengo en español me sale otra cosa: "Sin título - Bloc de notas".
Sólo cambia un carácter pero esa tontería hace que no me encuentre la ventana si uso tu programa.
La alternativa es usar la clase Windows de la ventana, que es "Notepad", y se usa así:
WinWaitActive("[CLASS:Notepad]")

Así no sólo funciona con todas las variedades de español, sino en otros idiomas totalmente diferentes. Eso siempre que la clase se mantenga con ese nombre, en XP y Vista he comprobado que es así.