Bonjour à tous,
Comme le titre du topic le dit, je cherchais à détecter les changements de focus via GUIRegisterMsg (pour pouvoir effectuer un redraw rapide à chaque perte de focus pour une autre appli, car certaines applis en overlay effacent les jolis dessins qui s'affichent sur mon script). Je suis tombé sur ce script d'aide pour la fonction "_WinAPI_RegisterShellHookWindow" :
► Afficher le texte_WinAPI_RegisterShellHookWindow
Code : Tout sélectionner
#include <WinAPISys.au3>
#include <APISysConstants.au3>
Opt('TrayAutoPause', 0)
OnAutoItExitRegister('OnAutoItExit')
Global $hForm = GUICreate('')
GUIRegisterMsg(_WinAPI_RegisterWindowMessage('SHELLHOOK'), 'WM_SHELLHOOK')
_WinAPI_RegisterShellHookWindow($hForm)
While 1
Sleep(1000)
WEnd
Func WM_SHELLHOOK($hWnd, $iMsg, $wParam, $lParam)
#forceref $iMsg
Switch $hWnd
Case $hForm
Switch $wParam
Case $HSHELL_WINDOWACTIVATED
Local $Title = WinGetTitle($lParam)
If IsString($Title) Then
ConsoleWrite('Activated: ' & $Title & @CRLF)
EndIf
EndSwitch
EndSwitch
EndFunc ;==>WM_SHELLHOOK
Func OnAutoItExit()
_WinAPI_DeregisterShellHookWindow($hForm)
EndFunc ;==>OnAutoItExit
Mais visiblement, ça ne fonctionne pas (et sur le forum anglophone, qq1 a déterré un topic de 2009 à cause de ce bug). La fonction WM_SHELLHOOK est apparemment appelée au bon moment (deux fois par contre, sans doute une fois pour le unfocus, et une autre pour le nouveau focus), mais $HSHELL_WINDOWACTIVATED n'est pas correctement géré.
Quelqu'un saurait comment pallier le problème?
Merci d'avance, et à bientôt !
PS: GUIRegisterMsg indispensable, ne pouvant pas me permettre un truc du style
Code : Tout sélectionner
If $focus <> WinActive("[ACTIVE]") Then
$focus = WinActive("[ACTIVE]")
redraw_MAINGUI()
EndIf
Car je ne pourrai pas mettre ce bout de code entre chaque ligne d'une procédure plus ou moins longue (copie de fichiers).