Click en un TrayTip ES Posible

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Click en un TrayTip ES Posible

Mensaje 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
Última edición por arkcrew el 15 Oct 2009, 15:26, editado 1 vez en total.
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Click en un TrayTip ES Posible

Mensaje 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 ¿?
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Click en un TrayTip ES Posible

Mensaje 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.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Click en un TrayTip ES Posible

Mensaje 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
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Click en un TrayTip ES Posible

Mensaje 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...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Click en un TrayTip ES Posible

Mensaje 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.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Click en un TrayTip ES Posible

Mensaje 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
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Click en un TrayTip ES Posible

Mensaje por arkcrew »

Bueno, alguna idea¿?
Responder