Página 1 de 1

problema al obtener los controles de un tooltip

Publicado: 10 Mar 2011, 20:13
por Jonny
Hola

Estoy haciendo una librería para manejar tooltips (al menos los de tipo tooltips_class32) ya que de momento no los he visto de otro tipo.

Tengo ya varias funciones hechas, pero al llegar a la que devuelve el texto del tooltip me he quedao encallao :P.

Se me ocurre, que estas ventanas, deben tener igual que el resto controles donde mostrar los iconos, textos... así pues, he intentado obtener los controles de una ventana de clase tooltips_class32 con este código que encontré hace ya tiempo por el foro inglés (no recuerdo el autor...):

Código: Seleccionar todo

#Include <WinAPI.au3>
$HDllCall=DllOpen("User32.dll")

Tooltip("Capturando controles", 50, 80, "Controles", 0, 1)

$WList=WinList("[class:tooltips_class32]")
For $I=1 To $WList[0][0] Step +1
If $WList[$I][0]=="Capturando controles" Then
$HParent=$WList[$I][1]
ExitLoop
EndIf
Next

;WinWait("Sin título - Bloc de notas")
;$HParent=WinGetHandle("Sin título - Bloc de notas")
$Handle=DllCallBackRegister("_EnumChildWindowsProc", "int", "hwnd;lparam")
DllCall($HDllCall, "BOOL", "EnumChildWindows", "HWND", $HParent, "ptr", DllCallBackGetPtr($Handle), "LPARAM", 0)
Global $HlpCLassName
Func _EnumChildWindowsProc($hWnd, $lParam)
Local $HlpCLassName
$HControlID=DllCall($HDllCall, "int", "GetDlgCtrlID", "HWND", $hWnd)
$HClassName=DllCall($HDllCall, "int", "GetClassNameW", "hwnd", $hWnd, "wstr", "", "int", 4096)
$HWinAPIClassName=_WinAPI_GetClassName($hWnd)
MsgBox(0, "", "$hWnd="&$hWnd&@CR&"$hControlID = "&$hControlID[0]&@CR&"my $ClassName = "&$HClassName[2]&@CR&"_WinAPI_GetClassName = "&$HWinAPIClassName)
Return 1
EndFunc
DllClose($HDllCall)
Resulta, que este código funciona con todas las ventanas menos con las que le paso como tooltips_class32.

Viendo que:

Código: Seleccionar todo

WinWait("Controles")
no detecta cuando está activa la ventana del tooltip, lo hice así para capturar el handle:

Código: Seleccionar todo

$WList=WinList("[class:tooltips_class32]")
For $I=1 To $WList[0][0] Step +1
If $WList[$I][0]=="Capturando controles" Then
$HParent=$WList[$I][1]
ExitLoop
EndIf
Next
(Por cierto, no se por qué con WinList() tal como lo hago, aparece el texto del tooltip que creo al principio, en el título de la ventana del tooltip)...

Con el código anterior, parece funcionar todo bien, pero no se por qué, no se ejecuta _EnumChildWindowsProc() (la función callback)., por lo que no puedo obtener los controles.

¿Sabeis qué puede pasar?, si esta api no funciona con tooltips o qué? parece, que:

Código: Seleccionar todo

DllCall($HDllCall, "BOOL", "EnumChildWindows", "HWND", $HParent, "ptr", DllCallBackGetPtr($Handle), "LPARAM", 0)
se ejecuta bien, no parece devolver ningún error...

¿Se os ocurre otra forma de capturar el texto de un tooltip?. La verdad, es que esta no me convence, porque esta api hace una llamada al callback para cada control y eso para una UDF no va muy bien :).

Acias,

Salu2!

Re: problema al obtener los controles de un tooltip

Publicado: 11 Mar 2011, 08:02
por Jonny
Hola

Vaya, parece que era muuuucho más sencillo que todo eso :P.

Pensé, que ControlGetText() no funcionaría, pero me equivoqué, sí devuelve el texto de los tooltips_class32.

De todas formas, si alguien sabe otra manera de listar los controles de una ventana diferente a la que puse en el post anterior, donde no se obtengan los controles de uno en uno será bien recibido :).

Salu2!