He ido quitando cosas del programa por si estaba pegándose con algo (por ejemplo también capturaba otros mensajes, había hotkeys globales y de formulario...). Pero el resultado es tan simple que no comprendo por qué no funciona.
El caso es que sólo funciona... ¡si el GUI no tiene controles!. Eso lo hace bastante inútil, claro.
Os pongo el código reducido que sigue sin funcionar, fijaos que ni una etiqueta se puede poner. Si comentáis la creación de la etiqueta funciona perfectamente.
Está comentada la creación y uso de un botón, por poner un control que toma foco, pero como digo con una simple etiqueta también falla.
Lo que hace es perder el foco nada más ejecutarse ¡aunque en realidad lo sigue teniendo! y a partir de ahí ni se entera de que lo está perdiendo o ganando.
La única manera es cuando minimizo, al restaurar sí toma foco e instantáneamente me manda un KILLFOCUS, aunque no lo ha perdido...
Código: Seleccionar todo
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
$focoGUI = GUICreate("Ventana Foco", 200, 100, 10, 10)
GUICtrlCreateLabel("Soy una etiqueta.", 16, 13, 100, 15) ; <-- Si se comenta esta línea todo va como la seda...
;$btnCerrar = GUICtrlCreateButton("Cerrar", 50, 50, 97, 25)
GUIRegisterMsg($WM_SETFOCUS, "WM_SETFOCUS")
GUIRegisterMsg($WM_KILLFOCUS, "WM_KILLFOCUS")
GUISetState(@SW_SHOW)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE ;, $btnCerrar
Exit
EndSwitch
WEnd
Func WM_SETFOCUS($hWnd, $iMsg, $iwParam, $ilParam)
ConsoleWrite("Foco adquirido: " & WinGetTitle($hWnd) & @LF)
Return $GUI_RUNDEFMSG
EndFunc
Func WM_KILLFOCUS($hWnd, $iMsg, $iwParam, $ilParam)
ConsoleWrite("Foco perdido: " & WinGetTitle($hWnd) & @LF)
Return $GUI_RUNDEFMSG
EndFunc