Rechtsklick auf Icon in SystemTray

  • Hallo,

    ich bin zurzeit auf der Suche nach einer Möglichkeit, einen Rechtsklick auf ein Icon im System Tray auszuführen.

    Dafür gibt es in diversen Foren schon fertige Skripte, die ich allesamt auch schon ausprobiert habe.

    Folgendes Skript funktioniert bei mir unter Windows 7 x64 soweit ohne Probleme:

    [autoit]

    #Include <GuiToolBar.au3>
    Global $hSysTray_Handle, $iSystray_ButtonNumber
    Global $sToolTipTitle = "Novell Services" ; <<<<<<<<<<<<<<<< Enter some tooltip text for the icon you want here
    $iSystray_ButtonNumber = Get_Systray_Index($sToolTipTitle)
    If $iSystray_ButtonNumber = 0 Then
    MsgBox(16, "Error", "Icon not found in system tray")
    Exit
    Else
    Sleep(500)
    _GUICtrlToolbar_ClickButton($hSysTray_Handle, $iSystray_ButtonNumber, "right")
    EndIf
    Exit

    [/autoit][autoit][/autoit][autoit]

    Func Get_Systray_Index($sToolTipTitle)
    ; Find systray handle
    $hSysTray_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
    Local $iSystray_ButCount = _GUICtrlToolbar_ButtonCount($hSysTray_Handle)
    If $iSystray_ButCount = 0 Then
    MsgBox(16, "Error", "No items found in system tray")
    Exit
    EndIf
    ; Look for wanted tooltip
    For $iSystray_ButtonNumber = 0 To $iSystray_ButCount - 1
    If StringInStr(_GUICtrlToolbar_GetButtonText($hSysTray_Handle, $iSystray_ButtonNumber), $sToolTipTitle) = 1 Then ExitLoop
    Next
    If $iSystray_ButtonNumber = $iSystray_ButCount Then
    Return 0 ; Not found
    Else
    Return $iSystray_ButtonNumber ; Found
    EndIf
    EndFunc

    [/autoit]


    Allerdings habe ich immernoch ein Problem..

    Undzwar funktioniert das Skript bei allen Icons, nur nicht bei dem wofür ich es brauche :thumbup:

    Dabei handelt es sich, wie oben schon als

    [autoit]

    $sToolTipTitle

    [/autoit]

    deklariert, um die "Novell Services". Das ist ein Anmelde-Client von Novell.

    Ich bekomme immer die Meldung "Icon not found in system tray".


    [Blockierte Grafik: http://www11.pic-upload.de/22.05.14/1p8xvpcq3ebq.jpg]


    Ich bin noch ziemlich neu in der Wissenschaft AutoIT - ich hoffe jemand hat eine Idee, oder sogar eine bessere Möglichkeit, als dieses Skript.

    Im voraus besten Dank für eure Hilfe!!


    Gruß


    Tim

    Einmal editiert, zuletzt von fd13_hsk (23. Mai 2014 um 07:31)

  • Ich hab die Funktion etwas angepasst damit es funktioniert:

    Spoiler anzeigen
    [autoit]

    #include <GuiToolBar.au3>
    Global $hSysTray_Handle, $iSystray_ButtonNumber
    Global $sToolTipTitle = "VNC Server" ; <<<<<<<<<<<<<<<< Enter some tooltip text for the icon you want here
    $iSystray_ButtonNumber = Get_Systray_Index($sToolTipTitle)
    If $iSystray_ButtonNumber = -1 Then
    MsgBox(16, "Error", "Icon not found in system tray")
    Exit
    Else
    Sleep(500)
    _GUICtrlToolbar_ClickButton($hSysTray_Handle, $iSystray_ButtonNumber, "right")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func Get_Systray_Index($sToolTipTitle)
    ; Find systray handle
    $hSysTray_Handle = ControlGetHandle('[Class:Shell_TrayWnd]', '', '[Class:ToolbarWindow32;Instance:1]')
    If @error Then Return SetError(1, 0, -1)
    ; Get systray item count
    Local $iSystray_ButCount = _GUICtrlToolbar_ButtonCount($hSysTray_Handle)
    If $iSystray_ButCount = 0 Then Return SetError(2, 0, -1)
    ; Look for wanted tooltip
    For $iSystray_ButtonNumber = 0 To $iSystray_ButCount - 1
    If StringInStr(_GUICtrlToolbar_GetButtonText($hSysTray_Handle, $iSystray_ButtonNumber), $sToolTipTitle) = 1 Then ExitLoop
    Next
    If $iSystray_ButtonNumber = $iSystray_ButCount Then Return SetError(3, 0, -1)
    Return $iSystray_ButtonNumber
    EndFunc ;==>Get_Systray_Index

    [/autoit]

    Die Funktion Get_Systray_Index() ist etwas ungünstig geschrieben. Weil nämlich im Fehlerfall 0 zurück gegeben wird. Siehe:

    [autoit]

    Return 0 ; Not found

    [/autoit]


    0 kann aber auch eine gültige ID sein.
    Sieht man ja auf deinen Window Info Screenshot dass Novell Services die Command ID 0 hat ;)
    Deswegen hab ich den Fehlerfall auf -1 geändert und zusätzlich noch errorcodes eingefügt
    @error = 1 bedeutet das das TrayControl nicht gefunden wurde
    @error = 2 bedeutet dass keine TrayIcons gefunden wurden
    @error = 3 bedeutet dass das Trayicon mit dem Text nicht gefunden wurde

  • Ich hänge mich mal mit an diesen Thread.

    @Schnitzel - Dein Script funktioniert super.

    Bis auf wenige Ausnahmen. Vielleicht gibt es für diese eine Lösung.

    Es geht um veränderbare Tooltipps und um die Teil-String-Suche.

    Als Fehler erscheint: "@error = 3 bedeutet dass das Trayicon mit dem Text nicht gefunden wurde".

    (1) wie müsste man Dein Script ändern, damit der Taskmanager auch über den Suchbegriff "Arbeitsspeicher" und nicht nur über "CPU" gefunden wird?

    Global $sToolTipTitle = "Arbeitsspeicher:" ; Taskmanager - geht nicht

    (2) ... und um dieses Programm geht es mir - es ist ein Timer. Vielleicht kennt das Programm jemand.

    Hot Alarm Clock

    (Falls jemand das Programm mal in einer virtuellen Umgebung testen möchte, Google zeit den Link ... oder darf man hier Programme direkt verlinken?)

    "Weiter Alarm: 20.10.2015"

    und noch eine Menge Text, je nachdem, was der nächste Timer beinhaltet.

    Und dieser Text wird leider nicht gefunden.

    Was tun?

    5 Mal editiert, zuletzt von AutoMit (20. Oktober 2015 um 18:05)