Page 1 sur 1

[..] Menus d'icone "Tray" : Action sur passage de souris

Posté : mar. 03 mars 2009 16:17
par Pollux
Salut tout le monde,

Je me suis lancé dans les fonctions du system tray (menus d'icone à droite de la barre des tâches).
J'ai créé des menus qui apparaissent quand on fait un clic droit sur l'icone dans le system tray.
Ce que j'aimerai faire, c'est que simplement en allant avec la souris sur les différents menus, différentes images apparaissent sur une fenetre, selon le menu sur lequel pointe la souris). Je ne veux pas que l'utilisateur ait à cliquer sur un menu avec avec sa souris. Les actions doivent s'effectuer simplement par la présence de la souris sur tel ou tel menu.
Je n'ai pas vu de fonction "tray" capable de réaliser cet effet, donc je ne vois pas trop comment faire.

Merci d'avance pour toute l'aide que vous pourrez m'apporter ;)



Pollux

Re: [..] Menus d'icone "Tray" : Action sur passage de souris

Posté : mar. 03 mars 2009 21:40
par Tlem
Je regardé vite fait et je n'ai rien vu permettant ce genre de chose.
Sans doute avec quelques recherches sur le forum Anglais. ;)

Re: [..] Menus d'icone "Tray" : Action sur passage de souris

Posté : mer. 04 mars 2009 20:06
par Pollux
Rebonsoir,

Ayant suivi votre conseil, j'ai posté également sur le forum anglais, j'espère y obtenir de l'aide ;)
J'ai également fouillé un bon paquet de sujets sur leur forum, et je suis tombé sur un code qui permet d'afficher une fenêtre quand la souris approche l'icône du script dans la barre des tâches, et de la masquer quand la souris s'en éloigne. Je "pense" qu'il y a moyen de l'adapter pour détecter tel ou tel menu du Tray, mais entre les ControlGetHandle et les GUICtrlToolbar_GetButtonRect je nage un peu. Je continue à chercher cependant.
Merci d'avance,

Pollux


PS: Commande pour créer un menu dans l'icône de tray: TrayCreateItem

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <Constants.au3>
#Include <GuiToolBar.au3>

Global $aIcon[4]
Find_Icon()

$hWin = GUICreate("Test", 100, 100)
GUISetState(@SW_HIDE, $hWin)

$fShowing = False

While 1
    
    If GUIGetMsg() = -3 Then Exit
    
    $aMouse = MouseGetPos()
    
    If $aMouse[0] >= $aIcon[0] And $aMouse[0] <= $aIcon[2] And $aMouse[1] >= $aIcon[1] And $aMouse <= $aIcon[3] Then
    ; Over icon
        If $fShowing = False Then
            $fShowing = True
            GUISetState(@SW_SHOW, $hWin)
            ConsoleWrite("Showing" & @CRLF)
        EndIf
        
    Else
    ; Off icon
        If $fShowing Then
            ConsoleWrite("Hidden" & @CRLF)
            GUISetState(@SW_HIDE, $hWin)
            $fShowing = False
        EndIf
    EndIf
    
WEnd


Func Find_Icon()

; Find systray handle
$SysTray_Handle = ControlGetHandle('[Class:Shell_TrayWnd]', '', '[Class:ToolbarWindow32;Instance:1]')
If @error Then
    MsgBox(16, "Error", "System tray not found")
    Exit
EndIf

; Get systray item count
$Systray_ButCount = _GUICtrlToolbar_ButtonCount($SysTray_Handle)
If $Systray_ButCount = 0 Then
    MsgBox(16, "Error", "No items found in system tray")
    Exit
EndIf

; Look for tooltip
$Tool_Tip = ""
For $Systray_ButtonNumber = 0 To $Systray_ButCount - 1
; Need to change "AutoIt" to name of your exe when compiled
    $Test = StringSplit(_GUICtrlToolbar_GetButtonText($SysTray_Handle, $Systray_ButtonNumber), "AutoIt" ,1)
    If $Test[0] <> 1 Then ExitLoop
Next

If $Systray_ButtonNumber = $Systray_ButCount Then
; Icon not found
    MsgBox(16, "Error", "AutoIt icon not found in system tray")
    Exit
Else
; Get absolute coords of icon
; get icon size
    $aIcon = _GUICtrlToolbar_GetButtonRect($SysTray_Handle, $Systray_ButtonNumber)
; get x coord of systray
    $aSysTray = ControlGetPos('[Class:Shell_TrayWnd]', '', '[Class:ToolbarWindow32;Instance:1]')
    $aIcon[0] = $aSysTray[0]
    $aIcon[2] = $aSysTray[0] + $aIcon[2]
; get y coord of taskbar
    $aTaskBar = WinGetPos('[Class:Shell_TrayWnd]', '')
    $aIcon[1] = $aTaskBar[1]
    $aIcon[3] = $aTaskBar[1] + $aIcon[3]
EndIf

EndFunc
Crédits à Melba23

Re: [..] Menus d'icone "Tray" : Action sur passage de souris

Posté : ven. 06 mars 2009 00:27
par papami
Bonsoir,

Faisable... il faut survoler la chose :D

-soit vous savez déterminer la position et la dimension du menu qui s'ouvre par clic sur l'icône (moi je ne sais pas et s'il y a une recette je suis preneur...)

-soit vous créez un "faux-menu" : petit GUI sans titre ni bouton, que vous affichez sur un clic d'icône (TrayGetMsg et $TRAY_EVENT_PRIMARYDOWN, par exemple)
à ce moment vous en maîtrisez la position les dimensions et les labels.

il suffit ensuite d'utiliser MouseGetPos() et de comparer avec les cordonnées du GUI : si on sort des clous on efface, si on est dans les limites on peut calculer facilement la hauteur et donc quel label on survole, en modifier la couleur de fond au passage et déballer ce que l'on veut, sans avoir à cliquer.

Dans le genre on peut aussi fabriquer une fausse barre de tâches. Dans ces conditions on connait l'emplacement des "icones" que l'on y place, et là aussi on peut travailler par survol, modifier le curseur, etc.

cela représente peu de lignes de programmation et je n'ai remarqué aucun problème de ressource (UC) mais je n'ai pas non plus essayé avec 20 scripts à la fois...

(Pour le code trouvé chez les anglais ce serait bien de donner le lien)

à vous ...

Re: [..] Menus d'icone "Tray" : Action sur passage de souris

Posté : ven. 06 mars 2009 21:24
par Pollux
Bonsoir ²

J'ai effectivement déjà envisagé cette solution (je maitrise assez bien tout ce qui touche aux fenêtres), cependant j'aimerai vraiment ne le faire qu'en dernier recours, car le rendu serait beaucoup moins esthétique.
Qui plus est, j'aimerai explorer des méthodes que je ne maitrise pas encore, pour enrichir mes possibilités futures sur Autoit.
Pour le sujet du forum anglais, le lien est ici:
http://www.autoitscript.com/forum/index ... opic=89051

Je suis persuadé qu'il ne manque pas grand chose pour concrétiser mon idée, les menus du tray étant des contrôles, il doit bien y avoir un moyen de détecter leur position.


Pollux