Página 1 de 1

Click en un TrayTip ES Posible

Publicado: 14 Oct 2009, 15:57
por arkcrew
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

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
El autor de este code: Rover



Un saludo

Re: Click en un TrayTip ES Posible

Publicado: 14 Oct 2009, 16:06
por arkcrew
Ahora bien, creen que me podrian ayudar a adaptarlo para que no se necesite un GUI y un boton para hacer la acción sino qeu se pueda hacer desde un traytip ¿?

Re: Click en un TrayTip ES Posible

Publicado: 14 Oct 2009, 23:34
por Chefito
Ante todo gracias por colgar el código, así podremos aprender cosas.

Ahora las broncas.........me parece muy bien que agradezcas al autor el haber hecho el código (ahí has estado muy acertado), pero decir que lo modificaste?????? :smt013 Para mi traducir el texto al español y meter un msgbox no es una modificación. Eso lo puede hacer cualquiera en 1 minuto.
Me parece bastante feo intentar llevarse algo de mérito con códigos de compañeros, cuando realmente no aportan nada a ese código :smt018 .
Dices que lo has modificado y preparado para que funcione correctamente???? Pero si ya funciona correctamente!!!!.
Por favor, medir vuestras palabras al hablar de códigos de otros. Lo digo porque cuando lees este mensaje parece que en realidad si has modificado algo de importancia.
Por cierto, el nick del que lo ha resuelto es rover......pero como le has quitado los comentarios iniciales al código ni te has dado cuenta.... :smt019 .
Por mi parte no ayudaré en este post.
El link original del código y su autor los dejo a continuación:
http://www.autoitscript.com/forum/index ... ntry703181

Saludos.

Re: Click en un TrayTip ES Posible

Publicado: 15 Oct 2009, 15:21
por arkcrew
Tecnicamente este esta modificado aunqeu no es del que yo hablo, com acabo de notar, no puedo adjuntar archivos sueltos creo qeu solo me admiten zip y rar, pero si quieren les cuento mis modificaciones, el gui que tiene lo quite al igual que muchas otras funciones.
Solo deje la parte que detecta el click en el traybox.

Me molestó bastante ya que ese mismo código que posteo no funciono en mi pc y tuve que reguntar en el foro, en cuanto a los créditos, no me gusta llevarme los méritos, pero en esta ocasion el código que POSEO si tiene una serie de cambios reelevantes aunque dudoq eu lo publiqeu porque es para una aplicación de código cerrado.

Un saludo

Re: Click en un TrayTip ES Posible

Publicado: 16 Oct 2009, 09:52
por Ximorro
Creo que Chefito no se ha dado cuenta de que comentabas que ponías el "Código original, el modificado lo guardo para mi".

Entiendo que no nos estás hablando de tu código, sino que has encontrado esto en otro foro y nos lo pones por si nos es interesante porque para ti lo ha sido... pues gracias.

Eso sí, teniendo en cuenta que tu programa va a ser de código cerrado, sería bueno que adjuntaras los créditos correspondientes en el "Acerca de" o en un TXT.
Y más si el programa va a ser con ánimo de lucro...

Re: Click en un TrayTip ES Posible

Publicado: 16 Oct 2009, 14:30
por Chefito
Ximorro escribió:Creo que Chefito no se ha dado cuenta de que comentabas que ponías el "Código original, el modificado lo guardo para mi".
No compañero.....es que editó el mensaje original y la mitad del texto no estaba puesto así. Lo que pasa que tu no llegaste a ver el post original (supongo).
Mira la fecha de edicción del primer mensaje y la fecha de mi respuesta. Yo respondí al 1º mensaje no al editado, el cual no me gustaba nada como se decían las cosas.

Me alegro de que arkcrew haya rectificado.

Saludos.

Re: Click en un TrayTip ES Posible

Publicado: 16 Oct 2009, 15:29
por arkcrew
Si, chefito tiene razón he modificado el post colocando el escript original con lso creditos iniciales, algo que sin querer pase por alto.

Mi intencion no es engañar a nadie, tan solo hago saber qeu el código que modifique esta adaptandose para qeu no trabaje con el gui (el que hace salir el traybox) sino para qeu trabaje desde un traytip anterior

No es que haya rectificado por nada, sino que pase por alto los créditos, en cuanto al autor puse "unmutual" ya que lei esta parte

* unmutual
* PipPipPipPip

* Group: Full Members
* Posts: 519
* Joined: 20-April 07
* Location:the unfashionable end of the western spiral arm of the Milky Way Galaxy

Entonces pense que el nick era ese y no vi el rover que ponia en el cuadr de encima XD

un saludo

Re: Click en un TrayTip ES Posible

Publicado: 14 Nov 2009, 00:08
por arkcrew
Bueno, alguna idea¿?