Hola
Como suponía, lo he entendido a medias...
Lo he probado y efectivamente funciona. El problema, ha estado a la hora de adaptarlo al programa que estoy haciendo, que el código tiene una estructura diferente a la que hiciste y claro, no funciona.
Este es el código (Funcional) jajaja:
Código: Seleccionar todo
#include <Constants.au3>
#Include <EditConstants.au3>
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#Include <Sound.au3>
#include <StaticConstants.au3>
#Include <WindowsConstants.au3>
#include <Array.au3>
#include <File.au3>
#include <String.au3>
#include <Misc.au3>
#Include <Timers.au3>
#Include <Ie.au3>
#Include <Inet.au3>
#Include <Word.au3>
#Include <WinAPI.au3>
Opt("MustDeclareVars", 0)
Opt("TrayAutoPause", 1)
Opt("TrayOnEventMode", 1)
Opt("TrayIconHide", 1)
Opt("TrayMenuMode", 1)
Opt("GUIOnEventMode", 1)
Opt("OnExitFunc", "ExitFile")
Opt("GUIResizeMode", $GUI_DOCKWIDTH+$GUI_DOCKHEIGHT+$GUI_DOCKTOP+$GUI_DOCKLEFT)
If _Singleton(@ScriptDir&"\"&@ScriptName, 1)=0 Then
Exit
EndIf
Global $FileName="SMS Lyte"
Global $WindowHandler
Global $WindowName
Global $BuffWindow
Global $CtrlWindowThread
Global $CtrlLoginThread
Global $MainLabel1
Global $MainLabel2
Global $LoginLabel1
Global $LoginLabel2
Global $LoginLabel3
Global $LoginLabel4
Global $LoginUserInput
Global $LoginPasswordInput
Global $LoginRememberUserCheckBox
Global $LoginRememberPasswordCheckBox
Global $LoginOkButton
Global $LoginCancelButton
Global $LoginBackButton
Global $LoginLostPasswordButton
Global $HandleLoginInput
LoginWindow()
CreateThread("all")
While 1
_ReduceMemory()
Wend
Func _ReduceMemory()
DllCall("psapi.dll", "int", "EmptyWorkingSet", "long", -1)
EndFunc
Func ExitFile()
Exit
EndFunc
Func LoginWM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
If ((ControlGetFocus($WindowHandler)=="Edit1" Or ControlGetFocus($WindowHandler)=="Edit2") And ($iwParam==1)) Then
ControlClick($WindowHandler, "", "Button4")
EndIf
EndFunc ;==>WM_COMMAND
Func LoginOkButton()
If $WindowName=="LoginWindow" Then
DropThread("all")
MainWindow()
CreateThread("all")
EndIf
EndFunc
Func LoginCancelButton()
Msgbox(0, "", "Has pulsado ""Cancelar!""")
Exit
EndFunc
Func GuiMaximize()
$WinMaximize=@SW_MAXIMIZE
EndFunc
Func GuiMinimize()
$WinMinimize=@SW_MINIMIZE
EndFunc
Func GuiRestore()
$WinRestore=@SW_RESTORE
EndFunc
Func LoginWindow()
GUIDelete()
$WindowHandler=GUICreate($FileName, 800, 600, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX))
$BuffWindow="LoginWindow"
$WindowName="LoginWindow"
$LoginLabel1=GUICtrlCreateLabel("Iniciar sesión.", 129, 137, 580, 17, $SS_CENTER)
$LoginLabel2=GUICtrlCreateLabel("Introduce tus datos de acceso al servicio:", 129, 221, 580, 17, $SS_CENTER)
$LoginLabel3=GUICtrlCreateLabel("Usuario", 129, 305, 580, 17, $SS_CENTER)
$LoginLabel4=GUICtrlCreateLabel("Contraseña", 129, 350, 580, 17, $SS_CENTER)
$LoginUserInput=GUICtrlCreateInput("", 214, 322, 200, 21)
$LoginPasswordInput=GUICtrlCreateInput("", 214, 367, 200, 21, BitOR($ES_PASSWORD, $ES_AUTOHSCROLL))
$LogInLostPasswordButton=GUICtrlCreateButton("¿Has olvidado la contraseña?", 129, 395, 200, 25, 0)
$LoginRememberUserCheckBox=GUICtrlCreateCheckBox("Recordar Usuario", 214, 423)
$LoginRememberPasswordCheckBox=GUICtrlCreateCheckBox("Recordar contraseña", 214, 451)
$LogInOkButton=GUICtrlCreateButton("Siguiente", 224, 479, 80, 21)
$LoginCancelButton=GUICtrlCreateButton("Cancelar", 314, 479, 80, 25, 0)
GuiCtrlSetState($LoginUserInput, $GUI_Focus)
$HandleLoginInput=GUICtrlGetHandle($LoginPasswordInput)
GUISetState()
GuiRegisterMsg($WM_COMMAND, "LoginWM_COMMAND")
EndFunc
Func MainWindow()
GUIDelete()
$WindowHandler=GUICreate($FileName, 800, 600, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX))
$BuffWindow="MainWindow"
$WindowName="MainWindow"
$MainLabel1=GUICtrlCreateLabel("Bienvenido a "&$FileName, 129, 137, 580, 17, $SS_CENTER)
$MainLabel2=GUICtrlCreateLabel(Chr(169)&"(C) 2009 Ivermedia", 129, 165, 580, 17, $SS_CENTER)
GUISetState()
EndFunc
Func CreateThread($XThread)
Switch($XThread)
Case "all"
$CtrlWindowThread=_Timer_SetTimer($WindowHandler, 0, "CtrlWindowThread")
$CtrlLoginThread=_Timer_SetTimer($WindowHandler, 0, "CtrlLoginThread")
Case "CtrlWindow"
$CtrlWindowThread=_Timer_SetTimer($WindowHandler, 0, "CtrlWindowThread")
Case "CtrlLogin"
$CtrlLoginThread=_Timer_SetTimer($WindowHandler, 0, "CtrlLoginThread")
EndSwitch
EndFunc
Func DropThread($XThread)
Switch($XThread)
Case "all"
_timer_KillTimer($WindowHandler, $CtrlWindowThread)
_timer_KillTimer($WindowHandler, $CtrlLoginThread)
Case "CtrlWindow"
_timer_KillTimer($WindowHandler, $CtrlWindowThread)
Case "CtrlLogin"
_timer_KillTimer($WindowHandler, $CtrlLoginThread)
EndSwitch
EndFunc
Func CtrlWindowThread($hWnd, $Msg, $iIDTimer, $dwTime)
GuiSetOnEvent($GUI_EVENT_CLOSE, "ExitFile")
GuiSetOnEvent($GUI_EVENT_MAXIMIZE, "GuiMaximize")
GuiSetOnEvent($GUI_EVENT_MINIMIZE, "GuiMinimize")
GuiSetOnEvent($GUI_EVENT_RESTORE, "GuiRestore")
GuiCtrlSetOnEvent($LoginCancelButton, "LoginCancelButton")
GuiCtrlSetOnEvent($LoginOkButton, "LoginOkButton")
EndFunc
Func CtrlLoginThread($hWnd, $Msg, $iIDTimer, $dwTime)
If WinActive($FileName) Then
If (GuiCtrlRead($LoginUserInput)=="" Or GuiCtrlRead($LoginPasswordInput)=="") Then
GuiCtrlSetState($LoginOkButton, $GUI_Disable)
Else
GuiCtrlSetState($LoginOkButton, $GUI_Enable)
EndIf
If GuiCtrlRead($LoginUserInput)=="" Then
GuiCtrlSetState($LoginLostPasswordButton, $Gui_Disable)
Else
GuiCtrlSetState($LoginLostPasswordButton, $Gui_Enable)
EndIf
EndIf
EndFunc
Como ves, he hecho en mi código por un lado las interfaces en funciones y por otro en vez de un while he optado por timers, para simular el multihilo (Me gustan más las aplicaciones multihilo (AUNQUE DEN MÁS PROBLEMAS)).
Quizá te parezca un caos de código jejjejje...
¿Porqué no funcionará?
Hay algunas cosas qe no entendí del código que hiciste:
Haciendo el programa como está en el código que he puesto (con cada ventana en una función, o en cualquier caso, creando barias ventanas en el programa) ¿He de crear la función
Func LoginWM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
If ((ControlGetFocus($WindowHandler)=="Edit1" Or ControlGetFocus($WindowHandler)=="Edit2") And ($iwParam==1)) Then
ControlClick($WindowHandler, "", "Button4")
EndIf
EndFunc
para tantos botones como quiera asociar a controles?
¿Como sabes que el Button "Siguiente es "Button4"? ¿Siempre obtendrá ese nombre?...
esque, los edits ("Edit1" y "Edit2") sí entiendo que tengan esos nombres para la función controlgetfocus() pero "Button4" no comprendo el porqué...
Por últomo:
¿Por qué la línea:
$HandleLoginInput=GUICtrlGetHandle($LoginPasswordInput)?
No debería ponerse también:
$HandleLoginInput=GUICtrlGetHandle($LoginUserInput)?
Bueno... creo que esto es todo, que menudo aluvión de preguntas jajaja.
gracias,
Salu2!