Mbee

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

10 posts in this topic

#1 ·  Posted (edited)

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

Share this post


Link to post
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

Share this post


Link to post
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!

Share this post


Link to post
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
1 person likes this

Share this post


Link to post
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

Share this post


Link to post
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!

Share this post


Link to post
Share on other sites

Well, even though I said I'd post if I got different results with all the Classic stuff disabled, I figured I'd post to confirm that there were no differences.  I got the same erroneous results...

Share this post


Link to post
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

Share this post


Link to post
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! :)

 

Share this post


Link to post
Share on other sites
51 minutes ago, Mbee said:

@AutoBert's code correctly covered all instances, a

nice to read. :)

Share this post


Link to post
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

  • Similar Content

    • BBs19
      By BBs19
      Features:
      Create modern looking borderless and resizable GUIs with control buttons (Close,Maximize/Restore,Minimize, Fullscreen, Menu) True borderless, resizeable GUI with full support for aerosnap etc. Many color schemes/themes included. See MetroThemes.au3 for more details. 3 type of Windows 8/10 style buttons. Modern checkboxes, radios, toggles and progressbar. All buttons, checkboxes etc. have hover effects! Windows 10 style modern MsgBox. Windows 10/Android style menu that slides in from left. Windows 10 style right click menu  
      Credits: @UEZ, for the function to create buttons with text using GDIPlus. @binhnx for his SSCtrlHover UDF
       
      Changelog:
      Download UDF with example:
       
       
    • keelaji
      By keelaji
      Hello,
      first of all i searched in the forum but i didn't found any solution to my problem.
      I am using windows 10.
      I made a script that is supposed to change the title to the active window, resize it to the smallest size possible (should be around 800 x 600) and move to (0, 0).
      I can change the title but i fail to do the other 2 tasks.
      i use wingettitle [active] copied from the F1 help tool (and this works), i i put the title in a variable and than i use
      winsettitle ($variable, "one") (this works too)
      winmove ("one", 0, 0, 800, 600) (doesn't do anything)
      i also tried
      local $x = winget ( "one")
      msgbox (0, "", $x) (i get a completely white box so i suppose winget can't have any data about my window ??)
      any suggestion ?
    • spuuunit
      By spuuunit
      I have a script that autostart with Windows, and sometimes some of my code is skipped. My script takes long pauses, so it's not that the script "goes too fast". This is my script for now:
      TraySetIcon("C:\Portables\AutoIt\_\icon.ico") AutoItSetOption("WinTitleMatchMode", 2) Run("C:\Portables\Key Manager\keymanager.exe") WinActivate("ATNSOFT Key Manager v") WinWaitActive("ATNSOFT Key Manager v") WinMove("ATNSOFT Key Manager v", "", 650, 200, 600, 800) Sleep(500) $pos = MouseGetPos() MouseClick("left", 1220, 210, 1, 100) MouseMove($pos[0], $pos[1], 100) Run("C:\Portables\foobar2000\foobar2000.exe") $version = 298 For $i = 0 To 99 Step 1 $path = "C:\Users\spunit\AppData\Local\Discord\app-0.0." & $version + $i & "\Discord.exe" If FileExists($path) Then Run($path) ExitLoop EndIf Next Run("C:\Portables\Firefox\FirefoxPortable.exe") Sleep(10000) WinMove("- Mozilla Firefox", "", 205, 0, 1214, 1047) Sleep(100) MouseClick("left", 1300, 15, 1, 10) Sleep(100) MouseClick("left", 1130, 275, 1, 10) Sleep(100) MouseClick("left", 930, 105, 1, 10) Sleep(100) Send("#{m}") Sometimes it skips to click and move mouse right after Key Manager starts. Almost always it skips everything after the last run.

      This type of script were never an issue with Windows 7... Any thoughts?
    • VIP
      By VIP
      I can not do anything with any user in the "Local Users Group"
      I tried from my account but I could not change my password (ie set new password)!
      But I was able to activate the Administrator account and I logged into the Administrator account and still could not do anything with my account! But I can set the password and disable the Administrator account from my account or Administrator.
      Any ideas? (Ignore the click on the Sign-in option in the Change Accout settings.)
       

    • dreivilo47
      By dreivilo47
      When I want to test Example 1 of Function _IECreate (AutoIt Help File), I see that function _IECreate doesn't work in Windows 10.
      Syntax Check (Ctrl+F5) gives no errors.
       
      Example 1:
      ; Create a browser window and navigate to a website #include <IE.au3> Local $oIE = _IECreate("www.autoitscript.com")  
      The error I receive with F5 (Tools, Go) in SciTE: