Click en un TrayTip ES Posible
Publicado: 14 Oct 2009, 15:57
Hola!
Muchas veces he intentado realizar una funcion que me permita detectar cuando alquien hace clcik en un traytip y realizar una funcion al respecto
Oues bien, hoy al fin lo he conseguido, buscando en el foro de autoitscript.com encontre la solución (a grandes rasgos XD) y yo la he modificado y preparado para qeu funcione correctamente:
Código original, el modificado lo guardo para mi.
Si quereis ver con más claridad lo qeu hace, añadid message boxes
El autor de este code: Rover
Un saludo
Muchas veces he intentado realizar una funcion que me permita detectar cuando alquien hace clcik en un traytip y realizar una funcion al respecto
Oues bien, hoy al fin lo he conseguido, buscando en el foro de autoitscript.com encontre la solución (a grandes rasgos XD) y yo la he modificado y preparado para qeu funcione correctamente:
Código original, el modificado lo guardo para mi.
Si quereis ver con más claridad lo qeu hace, añadid message boxes
Código: Seleccionar todo
;Author: rover 07/04/09
;MSDN reference:
;Shell_NotifyIcon Function
;http://msdn.microsoft.com/en-us/library/bb762159(VS.85).aspx
#include <GUIConstantsEX.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <StaticConstants.au3>
Global Const $NIN_BALLOONTIMEOUT = $WM_USER + 4
Global Const $NIN_BALLOONUSERCLICK = $WM_USER + 5
;Global Const $GWLP_WNDPROC = -4; for SetWindowLongPtr
Global $wProcNew = 0, $wProcOld = 0, $iMsg, $iError = 0
;get handle to AutoIt v3 hidden gui
Global $hGUI1 = _AutoItWinGetHandle()
;$hGUI1 = WinGetHandle(AutoItWinGetTitle())
;will work without GUICreate but global vars must be set in WndProc instead of GUICtrlCreateDummy/GUICtrlSendToDummy
;NOTE: _WinAPI_SetWindowLong() in WinAPI.au3 consistently returns 'The specified procedure could not be found' error 127
;error is due to the call being SetWindowLong instead of SetWindowLongW,
;using SetWindowLongW the error message is 'The operation completed successfully.
Global $hGUI2 = GUICreate("Traytip click detect", 260, 150, @DesktopWidth - 400, @DesktopHeight - 300)
Global $cTooltipClose = GUICtrlCreateDummy()
Global $cTooltipClick = GUICtrlCreateDummy()
Global $cLabel1 = GUICtrlCreateLabel("Traytip area clicked", 70, 80, 120, 16, $SS_CENTER)
Global $cLabel2 = GUICtrlCreateLabel("", 10, 110, 240, 16, $SS_CENTER)
GUICtrlSetBkColor(-1, 0xFFFFFF)
Global $cButton = GUICtrlCreateButton("Create Traytip", 70, 30, 120, 25)
GUISetState()
;subclass AutoIt v3 gui to get tray icon/traytip notifications
_SubclassWin($hGUI1, $wProcNew, $wProcOld)
Global $sLastError = _WinAPI_GetLastErrorMessage()
ConsoleWrite('- GetLastErrorMessage ' & $sLastError & "- Error: " & _WinAPI_GetLastError() & @CRLF)
ConsoleWrite('+$wProcOld = ' & $wProcOld & @CRLF)
GUICtrlSetData($cLabel2, $sLastError)
If StringInStr($sLastError, "Access is denied.") <> 0 Then
GUICtrlSetBkColor($cLabel2, 0xFF0000)
EndIf
While 1
$iMsg = GUIGetMsg()
Switch $iMsg
Case $cButton
TrayTip("Clear", "", 1)
TrayTip("I'm a title", "I'm the message", 5, 1)
Case $cTooltipClick
GUICtrlSetData($cLabel2, "")
GUICtrlSetColor($cLabel2, 0x0000FF)
Sleep(100)
GUICtrlSetData($cLabel2, "Tooltip clicked")
ConsoleWrite("!NIN_BALLOONUSERCLICK" & @CRLF)
Case $cTooltipClose
GUICtrlSetData($cLabel2, "")
GUICtrlSetColor($cLabel2, 0xFF0000)
Sleep(100)
GUICtrlSetData($cLabel2, "Tooltip closed")
ConsoleWrite("-NIN_BALLOONTIMEOUT" & @CRLF)
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func _SubclassWin($hWnd, ByRef $hProcNew, ByRef $hProcOld)
If $hProcNew <> 0 Or $hProcOld <> 0 Then Return SetError(1, 0, 0)
$hProcNew = DllCallbackRegister("_AutoItWndProc", "int", "hwnd;uint;wparam;lparam")
If @error Or $hProcNew = 0 Then Return SetError(2, 0, 0)
$hProcOld = DllCall("User32.dll", "int", "SetWindowLongW", "hwnd", _
$hWnd, "int", $GWL_WNDPROC, "ptr", DllCallbackGetPtr($hProcNew))
If @error Or $hProcOld[0] = 0 Then
$hProcOld = 0
Return SetError(3, 0, 0)
EndIf
$hProcOld = $hProcOld[0]
Return SetError(0, 0, 1)
EndFunc;==>_SubclassWin
Func _RestoreWndProc($hWnd, ByRef $hProcNew, ByRef $hProcOld)
If $hProcOld <> 0 Then _WinAPI_SetWindowLong($hWnd, $GWL_WNDPROC, $hProcOld)
If $hProcNew <> 0 Then DllCallbackFree($hProcNew)
$hProcNew = 0
$hProcOld = 0
EndFunc;==>_RestoreWndProc
Func OnAutoItExit()
_RestoreWndProc($hGUI1, $wProcNew, $wProcOld)
EndFunc;==>OnAutoItExit
Func _AutoItWndProc($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg, $iwParam, $ilParam
Switch $iMsg
Case $WM_USER + 1;AutoIt callback message value for tray icon (1025), can be retrieved with ReadProcessMemory and TRAYDATA struct
Switch $ilParam
Case $NIN_BALLOONTIMEOUT; timeout and by tooltip close icon
GUICtrlSendToDummy($cTooltipClose)
Case $NIN_BALLOONUSERCLICK
GUICtrlSendToDummy($cTooltipClick)
EndSwitch
EndSwitch
; pass the unhandled messages to default WindowProc
Return _WinAPI_CallWindowProc($wProcOld, $hWnd, $iMsg, $iwParam, $ilParam)
EndFunc;==>_AutoItWndProc
;===============================================================================
;
; Function Name: _AutoItWinGetHandle
; Description:: Returns the Windowhandle of AutoIT-Window
; Parameter(s): --
; Requirement(s): --
; Return Value(s): Autoitwindow Handle
; Author(s): Prog@ndy
;
;===============================================================================
;
Func _AutoItWinGetHandle()
Local $oldTitle = AutoItWinGetTitle()
Local $x = Random(1248578, 1249780)
AutoItWinSetTitle("qwrzu" & $x)
Local $x = WinGetHandle("qwrzu" & $x)
AutoItWinSetTitle($oldTitle)
Return $x
EndFunc;==>_AutoItWinGetHandle
Un saludo