Jump to content
Mbee

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

Recommended Posts

Mbee

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
BrewManNH

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
Mbee
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
AutoBert

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
  • Like 1

Share this post


Link to post
Share on other sites
BrewManNH

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
Mbee

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
Mbee

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
BrewManNH

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
Mbee
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
AutoBert
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

    • Dreamfire
      By Dreamfire
      Hi,
      Since today, exe's are being flagged as having a trojan by Windows Defender (Fuery.B!cl)
      Version:  3.3.14.3 - SciTE Version 3.7.3



       

    • PramodR
      By PramodR
      Hello,
      I have to execute below block of code in elevated previllage, as that particular wmic class will work only with admin previlage.
      i am getting out put when i launch autoit as administrator,  but i will not be able to launch autoit as admin in this particular case but my user have admin rights.
      is there any better way i can run those command as administrator.?
      tried below steps:
      i have tried #RequireAdmin but that creates a user prompt  Tried using Runas command but gives error as wrong username or password , stuck with that step.  
       
    • dwaynek
      By dwaynek
      traytip isn't working in windows 10. nothing happens when i use the Traytip command.
      here's a simple script i used:
      TrayTip("I'm a title", "I'm the message", 5) i tried changing the registry setting HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced ( which didn't have EnableBalloonTips) and creating a DWORD entry called EnableBalloonTips and setting it to 1 and logging off then back in. that did not resolve the problem.
      i'm running Windows 10 v1709 b16299.431
    • antonioj84
      By antonioj84
      Hi all to the forum guru and expert I am trying to  automate this. in the registry  I have the network profile name network 2 and network   I want to  change their  CATEGORY  to Private .  Can someone lead me in the right direction.
      Private is 1 and Public is 0
      #RequireAdmin Global $sHKLMRoot = @OSArch = "x64" ? "HKLM64" : "HKLM" RegWrite($sHKLMRoot &"\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\NewNetworks" ,'/v NetworkList /t REG_MULTI_SZ /d 00000000 /f') see  attached picture below
      Much appreaciate
       

    • PhoenixPRO
      By PhoenixPRO
      When I try to automate this install program I can not get any of the buttons to click with the "ControlClick" function or any mouse movement to move the mouse to the and click it.  My OS is Windows 10 64Bit.  I have tried both 32bit and 64bit installs of Autoit V3 to no avail.
      I could not even get the run command to start the program until I used the variation of the command below in the script.
      With the script below the install program starts but will not click the "Next" button no matter what I do.
      Any help will be greatly appreciated.
      Thanks in advance.
       
      #include <MsgBoxConstants.au3>
      Opt("MouseCoordMode", 0) ;1=absolute, 0=relative to active window, 2=client
      Local $Success
      Run(@ComSpec & " /c " & 'C:\PhoenixPro_Install\RDXUtil\RDX_Tools_setup.exe', "C:\PhoenixPro_Install\RDXUtil", @SW_HIDE )

      WinWait("RDX Tools 1.62 - InstallShield Wizard", "Welcome to the InstallShield Wizard for RDX Tools 1.62")
      WinActivate("RDX Tools 1.62 - InstallShield Wizard", "Welcome to the InstallShield Wizard for RDX Tools 1.62")
      ControlClick ("RDX Tools 1.62 - InstallShield Wizard", "Welcome to the InstallShield Wizard for RDX Tools 1.62", 1639, "left", 1) ;Next Button
×