Jump to content

[Solved] New "sys tray" access problems under Windows 10


Mbee
 Share

Recommended Posts

One of my GUI applications requires that a particular third-party application not only be running, but be present in the "sys tray" (aka Taskbar). When this 3p app is active but not in the systray/taskbar, it is not ready for proper use, and I must inform the user about this.

Here is a code snippet that used to work fine under Windows 7:

;
; #FUNCTION# =========================================================================================================
; Name...........: _Get_Systray_BtnIndex
; Description ...: Determines if an appllication with the specified title is running in the Systen Tray
;                   and if so, returns the relative index number of it's button on the tray.
; Syntax.........: _Get_Systray_BtnIndex($iTitleText)
; Parameters ....: $iTitleText  -> The (tool-tip) title of the desired application
; Return values .: Success - Returns the index number of the desired appliction button, 1 being the first
;                  Failure - Returns 0 if desired application is not found in the System Tray
;                             Sets @error as follows:
;                                0:  Normal return
;                               -1: System Tray was empty (i.e., no appllications running the tray)
;                               -2: No System Tray was found
; Remarks .......; Setting any parameter to -1 leaves the current value unchanged
;                  Setting the $iStyle parameter to 'Default' resets ALL parameters to default values <<<<<<<<<<<<<<<<<<<<<<<
;                  Setting any other parameter to "Default" only resets that parameter
; Author ........: Poster "war59312", and code was found at URL:
;                       http://www.autoitscript.com/forum/topic/40550-check-if-program-is-running-under-system-tray/#entry902746
;                   Modified by mjb on 26-June-2014 to return @extended error code rather than using MsgBox() to report errors.
;
Func _Get_Systray_BtnIndex($sToolTipTitle)
    ; Find systray handle
    Local $hSysTray_Handle = ControlGetHandle('[Class:Shell_TrayWnd]', '', '[Class:ToolbarWindow32;Instance:1]')
    If @error Then
        Return SetError( -2, 0, 0 )
    EndIf

    ; Get systray item count
    Local $iSystray_ButCount = _GUICtrlToolbar_ButtonCount($hSysTray_Handle)
    If $iSystray_ButCount = 0 Then
        Return SetError( -1, 0 , 0 )
    EndIf

    ; Look for wanted tooltip
    For $iSystray_ButtonNumber = 0 To $iSystray_ButCount - 1
        If StringInStr(_GUICtrlToolbar_GetButtonText($hSysTray_Handle, $iSystray_ButtonNumber), $sToolTipTitle) > 0 Then ExitLoop
    Next

    If $iSystray_ButtonNumber = $iSystray_ButCount Then
        Return 0                        ; Desired application is NOT running in the System Tray
    Else
        Return $iSystray_ButtonNumber   ; Application was found in the SysTray
    EndIf
EndFunc     ;==> _Get_Systray_BtnIndex
;

 

But what's happening under Windows 10 is that the "_GUICtrlToolbar_ButtonCount()" always returns 1, even though there are 10-14 items visible in the Task Bar.  Unsurprisingly, the single item returned has nothing to do with the 3'rd party application in question.

As you probably know, Microsoft made significant changes to the systray/taskbar since Windows 7 (or at least by Windows 10). I spent quite a while searching MSDN for some other way to accomplish what I need, but I must be too stupid to figure it out.

Please help.   Thanks!

 

Edited by Mbee
Link to comment
Share on other sites

You're not looking in the NotifyIconOverflowWindow window for more icons.

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Link to comment
Share on other sites

6 hours ago, BrewManNH said:

You're not looking in the NotifyIconOverflowWindow window for more icons.

Thanks for your reply, but I'm afraid I have no idea how to do that.  Can you tell me, please?

I looked around for help, and I found and then tried using the "Systray UDF" by @tuapeand modified by @Erik Pilsits posted here: _systray udf.

I chose it because if you set the $iWin parameter to 2, apparently the suggestion is that it is supposed to "look in the NotifyIconOverflowWindow for more icons".  But when I call "_SysTrayIconCount(2)", it always returns zero icons even though there are actually 10-14.

Please advise.  Thanks!

Link to comment
Share on other sites

Run this small example:

#include <Array.au3>
#include <GuiToolBar.au3>

$sSearchtext='Lautsprecher: 100%'   ;change to your needs
$iButton=Get_SysTray_IconText($sSearchtext)
MsgBox (64,'Searched Button','Button: '&$iButton&@CRLF&'Instance: '&@extended)

Func Get_SysTray_IconText($sSearch)
    Local $hSysTray_Handle
    For $i = 1 To 99
        ; Find systray handles
        $hSysTray_Handle = ControlGetHandle('[Class:Shell_TrayWnd]', '', '[Class:ToolbarWindow32;Instance:' & $i & ']')
        If @error Then
            ;MsgBox(16, "Error", "System tray not found")
            ExitLoop
        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")
            ContinueLoop
        EndIf

        Local $aSysTray_ButtonText[$iSysTray_ButCount]

        ; Look for wanted tooltip
        For $iSysTray_ButtonNumber = 0 To $iSysTray_ButCount - 1
            If $sSearch= _GUICtrlToolbar_GetButtonText($hSysTray_Handle, $iSysTray_ButtonNumber) Then _
            Return SetError(0, $i, $iSysTray_ButtonNumber)
        Next
    Next
    Return SetError(1, -1, -1)

EndFunc   ;==>Get_SysTray_IconText


Exit

it returns:

  • succes: the ButtonNumber and in @extended the instance of the toolbarwindow.
  • failur: -1 @error -1 and @extended -1
Link to comment
Share on other sites

Try this, it looks at both the visible system tray icons and the overflow (hidden) icons.

#include <GuiToolBar.au3>

Sleep(1000)
MsgBox(0, "", Get_SysTray_IconCount())

Func Get_SysTray_IconCount() ; http://www.autoitscript.com/forum/topic/157933-hinttray-tip-how-to-get-text/?p=1145366

    ; Find systray handle for "User Promoted Notification Area"
    Local $hSysTray_Handle = ControlGetHandle('[Class:Shell_TrayWnd]', '', '[Class:ToolbarWindow32;Instance:1]')
    If @error Then
        MsgBox(16, "Error", "System tray not found")
    EndIf
    ; Find systray handle for "Overflow Notification Area" i.e. hidden icons
    Local $hSysTray_Handle_Hidden = ControlGetHandle('[Class:NotifyIconOverflowWindow]', '', '[Class:ToolbarWindow32;Instance:1]')
    If @error Then
        MsgBox(16, "Error", "Overflow Notification Area not found")
    EndIf

    ; Get systray icon count
    Local $iSysTray_ButCount = _GUICtrlToolbar_ButtonCount($hSysTray_Handle)
    If $iSysTray_ButCount = 0 Then
        MsgBox(16, "Error", "No items found in system tray")
        Return ""
    EndIf

    ; Get hidden systray icon count

    $iSysTray_ButCount += _GUICtrlToolbar_ButtonCount($hSysTray_Handle_Hidden)

    Return $iSysTray_ButCount

EndFunc   ;==>Get_SysTray_IconCount

 

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Link to comment
Share on other sites

Thanks to you both for trying to help me out!!

@AutoBert: I got the failure return from your test code: Button -1  and Instance -1.

@BrewManNH: The output was only 1, which is way wrong.  So it appears the Overflow didn't count after all.

 

If it matters (and for all I know it does), I've tweaked my Win 10 Pro settings. For example, I'm using the Classic start menu and Classic Explorer settings, and I've used two different Win 10 tweakers: (1): WinAero tweaker and (2): Ultimate Windows Tweaker v4.2.1

I'm about to try the two tests again with the Classic stuff disabled.  If the results are any different, I'll post back to let you both know.

Thanks again!

Link to comment
Share on other sites

The script I posted showed me that I had 13 icons. This is on Windows 10, Enterprise x64. The script works, you're doing something wrong, or one of the programs you're using is causing it to fail.

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Link to comment
Share on other sites

15 minutes ago, BrewManNH said:

The script I posted showed me that I had 13 icons. This is on Windows 10, Enterprise x64. The script works, you're doing something wrong, or one of the programs you're using is causing it to fail.

Well, I figured it out...  What I did was to use Au3Info_x64 and then pointed to the systray/taskbar.  It turned out that "[Class:ToolbarWindow32;Instance:1]" was irrelevant and had an incorrect count.  However, Instance:2 showed all 14 taskbar items!

@AutoBert's code correctly covered all instances, and so it would have worked fine except for my mistake, which was that I didn't enter the full exactly correct string for his "$sSearchtext" parameter.  When I revised his code to use a substring search instead of a full exact search, it worked exactly right!

Problem solved.

Thanks again to you both! :)

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...