Página 1 de 1

ayuda con GUICtrlCreateCheckbox

Publicado: 15 Ago 2010, 04:24
por Andres_sc
Buenas sigo por aca aprendiento resulta que quiero hacer algo sencillo y me encontre con un problema
quiero ver si me pusen enseñar un poco como usar esto del checkbox, les dejo el codigo y despues me
explico mejor ke es lo ke kiero ke aga :smt003

Código: Seleccionar todo

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

GUICreate("checkbox", 282, 274, 192, 119)
$Checkbox1 = GUICtrlCreateCheckbox(" escribe 1 ", 48, 24, 145, 17)
$Checkbox2 = GUICtrlCreateCheckbox(" escribe 2 ", 48, 56, 137, 17)
$Checkbox3 = GUICtrlCreateCheckbox(" escribe 3 ", 48, 88, 129, 17)
$Checkbox4 = GUICtrlCreateCheckbox(" escribe 4 ", 48, 120, 113, 17)
$Boton1 = GUICtrlCreateButton(" Start ", 88, 184, 105, 33 )
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
        case $Boton1
			$manda1 = GUICtrlRead($Checkbox1)
			sleep(5000)
			send($Checkbox1)
            send("{ENTER}")
	EndSwitch
WEnd
Como ven son solo 4 checkbox y un boton start.
lo que quiero es que al apretar start mande un mje ,por ejemplo cuando dejo tildado el primer checkbox
que escriba "hola" si dejo tildado el segundo ke diga "chau" , haci con los 4.
y por supuesto que si dejo tildado los 4 que escriba los 4 mje, agradeceria que me den una mano o me guien
un poco como lo podria hacer por que la verdad estuve mirando por todo el foro y no encontre algo concreto
o bien que yo lo entienda.
en la ayuda traduci la parte de checkbox pero sigo igual desde ya gracias :smt023

Re: ayuda con GUICtrlCreateCheckbox

Publicado: 16 Ago 2010, 08:32
por Ximorro
Primero quita ese Sleep(5000) ¡lo estás paralizando 5 segundos!
Mírate el comando Send, es para enviar teclas como si estuvieras tocando el teclado, y no es lo que quieres hacer.

Para ver si un chekbox está marcado me temo que no es tan fácil, en principio es efectivamente con GUICtrlRead($Checkbox), pero resulta que esta función puede devolver dos cosas para un checkbox: si está marcado ($GUI_CHECKED), que es lo que queremos saber, o si tiene el foco ($GUI_FOCUS) que en este caso nos da igual.
Así que para saber qué nos está devolviendo la función tenemos que separar los dos valores con un BitAnd. Se trata de ver qué bit está activo. Si no lo entiendes mucho no pasa nada, pero entiende que se hace así y úsalo. Por comodidad yo me hago una función que me dice si un checkbos está activo:

Código: Seleccionar todo

Func _chkIsChecked($chk)
	Return BitAnd(GUICtrlRead($chk),$GUI_CHECKED) = $GUI_CHECKED
EndFunc
Si lo que quisieras saber es si tiene el foco, puedes hacer otra función similar con $GUI_FOCUS en vez de $GUI_CHECKED.

Así que tu programa puede quedar así (pongo a partir del While, lo demás es igual):

Código: Seleccionar todo

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit
      Case $Boton1
         If _chkIsChecked($Checkbox1) Then MsgBox(0,"CHECK 1", "Hola")
         If _chkIsChecked($Checkbox2) Then MsgBox(0,"CHECK 2", "Chau")
         If _chkIsChecked($Checkbox3) Then MsgBox(0,"CHECK 3", "Soy el 3")
         If _chkIsChecked($Checkbox4) Then MsgBox(0,"CHECK 4", "Eyyyyyyyy")
   EndSwitch
WEnd

Func _chkIsChecked($chk)
	Return BitAnd(GUICtrlRead($chk),$GUI_CHECKED) = $GUI_CHECKED
EndFunc

Re: ayuda con GUICtrlCreateCheckbox

Publicado: 16 Ago 2010, 18:14
por Andres_sc
Gracias Ximorro por tu ayuda sos un grande :smt023
vamos a ver si entendi voy a probar y te aviso como me salio :smt003
gracias nuevamente :smt038

Re: ayuda con GUICtrlCreateCheckbox

Publicado: 16 Ago 2010, 19:39
por Andres_sc
Bueno ya me salio lo que quieria que aga :smt003 me sirvio mucho tu ayuda
pero yo queria ke escriba en donde yo quiera asi que cambie por esto

Código: Seleccionar todo

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
      Case $GUI_EVENT_CLOSE
         Exit
	 Case $Boton1
		 sleep(5000)
         If _chkIsChecked($Checkbox1) Then send("hola 1")
		 If _chkIsChecked($Checkbox1) then send("{ENTER}")
		 If _chkIsChecked($Checkbox2) Then send("hola 2")
		 If _chkIsChecked($Checkbox2) Then send("{ENTER}")
         If _chkIsChecked($Checkbox3) Then send("hola 3")
         If _chkIsChecked($Checkbox3) Then send("{ENTER}")
		 If _chkIsChecked($Checkbox4) Then send("hola 4")
         If _chkIsChecked($Checkbox4) Then send("{ENTER}")
   EndSwitch
WEnd
lo que logre es que escriba lo que tenga cada checkbox y mande un enter.
el sleep es para que me de tiempo hacer click en donde yo quiero que lo escriba.
por ej: un block de notas.
muchas gracias por la ayuda nuevamente :smt023
solo me queda una duda, hay alguna forma de que cuando ago que escriba asi
pueda seguir usando algun otro programa?
espero que me entiendan :smt017
si yo por ejemplo ago que escriba mas palabras en cada checkbox tengo ke esperar
que termine de escribir todo por ke si abro por ejemplo el msn sigue escribiendo en
donde aga click o dnd este el puntero. :smt017

Re: ayuda con GUICtrlCreateCheckbox

Publicado: 17 Ago 2010, 08:08
por Ximorro
No hace falta que pongas por separado el texto y el Enter.
Para empezar se podría poner con un IF, es conveniente pues así sólo compruebas una vez la condición:

Código: Seleccionar todo

If _chkIsChecked($Checkbox1) Then
    Send("hola 1")
    Send("{ENTER}")
EndIf
Eso para que recuerdes lo de los IF, pero es que en el caso del Send no hace falta, porque puedes enviar el enter también con las teclas normales:

Código: Seleccionar todo

Send("hola 1{ENTER}")
Así que lo puedes poner todo en una línea.

Respecto a lo otro... se puede hacer con ControlSend, en ese caso no será necesario el Sleep, pues le dices a qué control tiene que mandar el texto.

Tienes que saber qué ventana y control es, tienes que usar la utilidad Au3Info.exe que viene con AutoIt. Abres la aplicación donde quieres escribir y pones el ratón sobre el control (por ejemplo el notepad, y te pones sobre la zona de edición). Yo lo he hecho y veo por ejemplo que la ventana se llama "Sin título - Bloc de notas" (aún no le he puesto nombre) y el control es Clase Edit, instancia 1, así que haría

Código: Seleccionar todo

ControlSend("Sin título - Bloc de notas", "", "[CLASS:Edit; INSTANCE:1]", "hola 1{ENTER}")
Lo de [CLASS:Edit; INSTANCE:1] se usa tanto que se pueden juntar en un texto y AutoIT también lo entiende:

Código: Seleccionar todo

ControlSend("Sin título - Bloc de notas", "", "Edit1", "hola 1{ENTER}")