Dios!!! Escribí yo esto? Ni me acordaba
.
Mmmmmm.....programar con apis es algo complicado. Ya ni te cuento manejar hooks
. Se necesita saber bastante de apis de windows y autoit. Es un nivel bastante avanzado.
Supongo que si hubieses analizado el código y entendido (creo que no lo entiendes), hubieses visto que dejé ConsoleWrite($wparam) dentro de la función que recoge los mensajes de las ventanas. Analizando estos mensajes devueltos, hubieses visto que cuando cambias el título de la ventana salta varias veces el 6 en hexadecimal. Pues ya tienes el mensaje que necesitas
.
Vale, lo vamos a hacer bien. Vamos a esta página del msdn de microsoft para ver los valores de los códigos hook que nos puede mandar una ventana. Se trata del primer parámetro de la función ShellProc:
http://msdn.microsoft.com/en-us/library ... S.85).aspx
Bueno, pues leyendo un poquito y traduciendo mal y pronto, vemos esto que es lo que nos interesa:
HSHELL_REDRAW
6
The title of a window in the task bar has been redrawn.
Dios!!! Sorpresa!!! Coincide con el número 6 del principio!!
.
Pues con esto y un bizcocho ya tenemos la constante que necesitamos.
Un código que te dice cual es el título de la ventana activa y si ha cambiado podría ser algo así:
Código: Seleccionar todo
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
Global Const $HSHELL_WINDOWACTIVATED = 4
Global Const $HSHELL_REDRAW = 6
Global $tituloAnterior
$hGUI = GUICreate("My Ownerdrawn Created Button", 300, 200)
GUIRegisterMsg(_WinAPI_RegisterWindowMessage("SHELLHOOK"), "FocoDeVentana")
ShellHookWindow($hGui, 1)
GUISetState(0)
$tituloAnterior=WinGetTitle("[active]")
ConsoleWrite(">>La ventana activa es: " & $tituloAnterior & @LF&@LF)
While 1
Sleep(10)
WEnd
Func FocoDeVentana($hWnd, $Msg, $wParam, $lParam)
;~ ConsoleWrite($wparam)
Switch $wParam
Case $HSHELL_REDRAW=$wparam
$tituloVentana=WinGetTitle("[active]")
If $tituloVentana<>$tituloAnterior Then
$tituloAnterior=$tituloVentana ;con esto evitamos que se repita varias veces el consolewrite, ya que el mismo mensaje se lanza varias veces.
ConsoleWrite("<<El título de la ventana ha cambiado. Ahora es: " & $tituloVentana & @LF & @LF)
EndIf
Case $HSHELL_WINDOWACTIVATED
ConsoleWrite(">>La ventana activa es: " & WinGetTitle("[active]") & @LF&@LF)
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
Func ShellHookWindow($hWnd, $bFlag)
Local $sFunc = 'DeregisterShellHookWindow'
If $bFlag Then $sFunc = 'RegisterShellHookWindow'
Local $aRet = DllCall('user32.dll', 'int', $sFunc, 'hwnd', $hWnd)
Return $aRet[0]
EndFunc
Como habrás comprobado dispones de varios mensajes que envían las ventanas en la página del mdsn que te pasé antes. Puedes capturarlos y hacer que haga lo que quieras añadiendolos al switch.
Un dato curioso que se me acaba de ocurrir ahora mismo. Por ejemplo, sabiendo el handle de una ventana específica a la cual le quisieses capturar cualquier tipo de mensajes, podrías utilizar la api getmessage. Tendrías que implementarla (y sus estructuras) y hacer alguna otra cosilla que seguro que es complicada
.
Tiene que haber muchas más formas de hacer cosas de estas. Las apis de win son un mundo. Te puedes volver loco
.
Saludos.