Tras la consulta que hacía hace algunos días en:
[ul] http://www.emesn.com/autoitforum/viewto ... f=3&t=2264 [/ul]
Chefito colgó unas funciones muy interesantes para hacer lo que necesitaba entre otras cosas, pero no se por qué, no me funcionaron, pues me devolvían siempre un código de error (como que el foco no estaba en ningún control cuando realmente lo estaba), no se que haría mal...
En cualquier caso, me animé gracias a que Ximorro me dió alguna pista para hacer lo que necesitaba en el post anterior, y Me arranqué haciendo mi propia función[/b :), que siempre es interesante crear tu propio código :P.
así pues, aquí teneis la función ¡con control de errores! que a Chefito le daba pereza implementar :).
Código: Seleccionar todo
Func IsInControl($WinTitle, $ControlID, $PointerType=0, $ControlType="all")
;----------
; - Comprueba si el puntero del ratón o el foco del teclado están sobre el objeto indicado en la ventana especificada.
; - Argumentos: $WinTitle: Título de la ventana del control a comprobar.
;$ControlID: Handle del control a comprobar, devuelto por las funciones GuiCtrlCreate...().
;$PointerType: Foco a comprobar si está sobre el control: 0 (por defecto: Cursor del ratón. 1: Foco del teclado.
;$ControlType: Tipo del control que se chequea: "all" (por defecto): Cualquier tipo de control.
;-Este parámetro permite simplificar la programación de eventos en controles de un tipo concreto ("Button" por ejemplo).
;-Si se desea realizar una acción cuando el foco del teclado está sobre un botón, basta con pasarle el Handle de este a $ControlID y "button" a $ControlType.
;-De esta forma, si el control indicado es de tipo "Button" y el foco del teclado está sobre él, la función devolverá true (1).
; - Valores de retorno: Al fallar: Devuelve -1.
;Con éxito:
;Devuelve 1 si el cursor indicado en $PointerType está sobre el control indicado y si este coincide con el tipo de control (si se especifica en $ControlType).
;Devuelve 0 si el cursor indicado en $PointerType no está sobre el control indicado o si lo está, pero el tipo del control no coincide con el indicado (si se especifica en $ControlType).
;Autor: Jonny (Para el foro de AutoIt en Español).
;----------
Local $CurrentPosMouse, $CurrentPosFocus, $GetCTRLType, $GetCTRLID
If ($WinTitle=="" Or $ControlID=="" Or $PointerType=="" Or $ControlType=="") Then Return -1
$PointerType=Int($PointerType)
If ($PointerType<>0 And $PointerType<>1) Then Return -1
Switch($PointerType)
Case 0
$CurrentPosMouse=GuiGetCursorInfo($WinTitle)
$GetCTRLType=_WinAPI_GetClassName($CurrentPosMouse[4])
If ((Not IsArray($CurrentPosMouse)) Or ($CurrentPosMouse[4]==0) Or ($CurrentPosMouse[4]<>$ControlID) Or ($CurrentPosMouse[4]==$ControlID And (StringLower($ControlType)<>"all" And StringLower($ControlType)<>StringLower($GetCTRLType)))) Then Return 0
If (($CurrentPosMouse[4]==$ControlID) And ((StringLower($ControlType)=="all") Or (StringLower($ControlType)<>"all" And StringLower($ControlType)==StringLower($GetCTRLType)))) Then Return 1
Case 1
$CurrentPosFocus=ControlGetHandle($WinTitle, "", ControlGetFocus($WinTitle, ""))
$GetCTRLID=DllCall("User32.dll", "int", "GetDlgCtrlID", "hwnd", $CurrentPosFocus)
$GetCTRLType=_WinAPI_GetClassName($GetCTRLID[0])
If (($GetCTRLID[0]=="") Or (@Error==1) Or ($GetCTRLID[0]<>$ControlID) Or ($GetCTRLID[0]==$ControlID And (StringLower($ControlType)<>"all" And StringLower($ControlType)<>StringLower($GetCTRLType)))) Then Return 0
If (($GetCTRLID[0]==$ControlID) And ((StringLower($ControlType)=="all") Or (StringLower($ControlType)<>"all" And StringLower($ControlType)==StringLower($GetCTRLType)))) Then Return 1
Case Else
Return -1
EndSwitch
EndFunc
Como podeis ver en la mini-documentación de la función, entre los parámetros que admite, está "$ControlType", que lo puse porque para el menú que quiero diseñar, quiero que al estar el foco del teclado o el cursor del ratón sobre un botón, se produzca un evento, pero sólo si se trata de un botón, y no de un label por ejemplo. Pensé entonces, que este parámetro ahorraría algo de código, ya que si se especifica el tipo de control (ver los de la ayuda de autoit) en este parámetro, la función podría hacer el trabajo de comprobar si el ratón o el teclado tienen seleccionado el control indicado, y este es del tipo que se necesita; de ser así, devuelve 1; en caso contrario devuelve 0 (aunque el teclado o el ratón tengan el foco sobre el control indicado).
También puede dejarse el valor por defecto de "$ControlType" ("all") para que no haga distinciones entre el tipo de control seleccionado y el especificado en "$ControlID". En cuyo caso, devuelve 1 si el control indicado en "$ControlID" está seleccionado por el teclado o el ratón, sin importar qué tipo de control sea.
Además, preferí unificar tanto la detección del ratón como del foco del teclado en una única función, que perfectamente podría haber hecho en dos, pero bueno, Cuestión de gustos :P.
He intentado hacerlo lo más simplificado posible, tanto que leerlo es un suplicio con esos algoritmos tan largos y complicados, con tantas precedencias de paréntesis ¡Pero queda más pofesional! :).
Se admiten sugerencias, bugs...
Espero que os guste.
Salu2!