Jump to content

TrayTipGUI to send a message to the tray


ioa747
 Share

Recommended Posts

TrayTipGUI.au3  is a  custom GUI to send a message to the tray from other script

... and can accept multiple messages which remain on the screen without the script waiting for the shown time

can also use any icon  from an external file or internally from registered libraries

 

TrayTipGUI.au3

;https://www.autoitscript.com/forum/topic/209408-traytipgui-to-send-a-message-to-the-tray/

#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7
;TrayTipGUI.au3
; custom GUI to send a message to the tray

#NoTrayIcon
#include <MsgBoxConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <WinAPIProc.au3>
#include <WinAPISys.au3>

Local $MinY
Local $iParams = $CmdLine[0]
If Not $iParams Then ; examle if no parameters
    Local $iParams[5] = [4, "   * This is an example...", _
            "This means that you have run the " & @CRLF _
             & "    -->  " & @ScriptName & "  <--  " & @CRLF & @CRLF _
             & " without command line parameters." & @CRLF _
             & " and for this reason act as demo.", 10, 2061]
Else
    $iParams = $CmdLine
EndIf

TrayTipGUI($iParams[1], $iParams[2], $iParams[3], $iParams[4])

Exit

Func TrayTipGUI($Title, $Msg, $Timeout = 5, $Icon = 0)
    ;Colors for the TrayMsg GUI.    0x14171b; 0xFFFFFF; 0xBBBBBB;
    Local $BackColor = 0x14171b, $TitleColor = 0xFFFFFF, $MsgColor = 0xBBBBBB

    ;Get DeskTop size
    Local $DTs = WinGetPos("[CLASS:Shell_TrayWnd]")
    ConsoleWrite("X=" & $DTs[0] & " Y=" & $DTs[1] & " W=" & $DTs[2] & " H=" & $DTs[3] & @CRLF)
    ; X=0 Y=1040 W=1920 H=40 * <--- main value

    $MinY = $DTs[1]

    ;get the cnt of @TrayTipGUI
    Local $WinCnt = GetTrayCnt() + 1
    ConsoleWrite("$WinCnt=" & $WinCnt & @CRLF)

    ;GUI
;~  Local $hGUI = GUICreate("@TrayTipGUI", 450, 150, @DesktopWidth - 460, @DesktopHeight, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
    Local $hGUI = GUICreate("@TrayTipGUI", 450, 150, $DTs[2] - 460, $DTs[1] + $DTs[3], $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))

    GUISetBkColor($BackColor)
    WinSetTrans($hGUI, "", 245) ; * <-- transparency seting range 0 - 255

    ;Exit button
    Local $idExit = GUICtrlCreateButton("X", 427, 3, 20, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "Arial")
    GUICtrlSetBkColor(-1, $BackColor)
    GUICtrlSetColor(-1, $TitleColor)

    ;Title
    GUICtrlCreateLabel($Title, 10, 10, 410, 35)
    GUICtrlSetFont(-1, 11, 600, 0, "Arial")
    GUICtrlSetColor(-1, $TitleColor)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

    ;Msg
    Local $idMsg = GUICtrlCreateLabel($Msg, 80, 50, 360, 95)
    GUICtrlSetFont(-1, 11, 600, 0, "Arial")
    GUICtrlSetColor(-1, $MsgColor)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

;~ ************ Icons Library **************************
;~ C:\Windows\System32\imageres.dll $cnt = 334  --> 0000
;~ C:\Windows\system32\shell32.dll  $cnt = 329  --> 1000
;~ C:\Windows\SysWOW64\wmploc.dll   $cnt = 159  --> 2000
;~ C:\Windows\System32\ddores.dll   $cnt = 149  --> 3000
;~ C:\Windows\System32\mmcndmgr.dll $cnt = 129  --> 4000
;~ C:\Windows\system32\ieframe.dll  $cnt = 103  --> 5000
;~ C:\Windows\System32\compstui.dll $cnt = 101  --> 6000
;~ C:\Windows\System32\setupapi.dll $cnt =  62  --> 7000

    Switch $Icon

        Case 1 To 334 ; icon from C:\Windows\System32\imageres.dll  $cnt = 334
            GUICtrlCreateIcon("imageres.dll", $Icon * -1, 10, 43, 64, 64)

        Case 1001 To 1329 ; icon from C:\Windows\system32\shell32.dll   $cnt = 329
            $Icon -= 1000
            GUICtrlCreateIcon("shell32.dll", $Icon * -1, 10, 43, 64, 64)

        Case 2001 To 2159 ; icon from C:\Windows\SysWOW64\wmploc.dll    $cnt = 159
            $Icon -= 2000
            GUICtrlCreateIcon("wmploc.dll", $Icon * -1, 10, 43, 64, 64)

        Case 3001 To 3149 ; icon from C:\Windows\System32\ddores.dll    $cnt = 149
            $Icon -= 3000
            GUICtrlCreateIcon("shell32.dll", $Icon * -1, 10, 43, 64, 64)

        Case 4001 To 4129 ; icon from C:\Windows\System32\mmcndmgr.dll  $cnt = 129
            $Icon -= 4000
            GUICtrlCreateIcon("mmcndmgr.dll", $Icon * -1, 10, 43, 64, 64)

        Case 5001 To 5103 ; icon from C:\Windows\system32\ieframe.dll   $cnt = 103
            $Icon -= 5000
            GUICtrlCreateIcon("ieframe.dll", $Icon * -1, 10, 43, 64, 64)

        Case 6001 To 6101 ; icon from C:\Windows\System32\compstui.dll  $cnt = 101
            $Icon -= 6000
            GUICtrlCreateIcon("compstui.dll", $Icon * -1, 10, 43, 64, 64)

        Case 7001 To 7062 ; icon from C:\Windows\System32\setupapi.dll  $cnt = 62
            $Icon -= 7000
            GUICtrlCreateIcon("setupapi.dll", $Icon * -1, 10, 43, 64, 64)

        Case Else
            Local $tmp = StringSplit($Icon, ",")
            If $tmp[0] = 1 Then ; single icon file
                If $tmp[1] = 0 Then ; if no icon maximize the msg
                    GUICtrlSetPos($idMsg, 10, 48, 440, 97) ; 80, 50, 360, 90
                Else ; single icon file
                    GUICtrlCreateIcon($tmp[1], -1, 10, 43, 64, 64)
                EndIf

            ElseIf $tmp[0] = 2 Then ; if .dll file with icon index
                GUICtrlCreateIcon($tmp[1], $tmp[2] * -1, 10, 43, 64, 64)

            Else ; unknown situation
                MsgBox(0, "Else unknown situation", $Icon)
            EndIf

    EndSwitch

    GUISetState(@SW_SHOW, $hGUI)

    ;shows up the GUI
    Local $WPos = WinGetPos($hGUI)
    ;[0]=X; [1]=Y; [2]=Width; [3]=Height
    WinMove($hGUI, "", $WPos[0], $MinY - 150 - 10, $WPos[2], $WPos[3], 5)

    ; Begin the timer and store the handle
    Local $hTimer, $fDiff
    $hTimer = TimerInit()

    ;*******************************************
    Do    ; Loop until the TimerDiff > $Timeout
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE, $idExit
                ExitLoop
        EndSwitch

        Sleep(100)

        ;Find the difference in time from the previous call of TimerInit
        $fDiff = TimerDiff($hTimer)

    Until $fDiff > $Timeout * 1000
    ;*******************************************

    ;disappear the GUI
    WinMove($hGUI, "", $WPos[0], @DesktopHeight, $WPos[2], $WPos[3], 5)

    ;Delete the previous GUI and all controls.
    GUIDelete($hGUI)
EndFunc   ;==>TrayTipGUI
;----------------------------------------------------------------------------------------
Func GetTrayCnt()    ;get the cnt of @TrayTipGUI
    Local $aData = _WinAPI_EnumDesktopWindows(_WinAPI_GetThreadDesktop(_WinAPI_GetCurrentThreadId()))
    Local $WinTitle, $WCnt, $WinPos
    For $i = 1 To $aData[0][0]
        $WinTitle = WinGetTitle($aData[$i][0])
        If $WinTitle = "@TrayTipGUI" Then
            $WinPos = WinGetPos($aData[$i][0])
            If $WinPos[1] < $MinY Then $MinY = $WinPos[1]
            $WCnt += 1
        EndIf
    Next
    Return $WCnt
EndFunc   ;==>GetTrayCnt
;----------------------------------------------------------------------------------------

 

Example1.au3  -  Example for using TrayTipGUI

; https://www.autoitscript.com/forum/topic/209408-traytipgui-to-send-a-message-to-the-tray/
;Example1.au3  -  Example for using TrayTipGUI

#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7

Local $Str = "This is an  Example for using " & @CRLF _
         & "-->  TrayTipGUI.au3" & @CRLF _
         & "and come in screen like notification"

Tip($Str, "This is an example...", 6, 2060)

Sleep(4000)

$Str = "and can accept multiple messages " & @CRLF _
         & "which remain on the screen" & @CRLF _
         & "without the script waiting" & @CRLF _
         & "for the shown time "

Tip($Str, "This is another one example...", 7, '"shell32.dll", 236') ; with icon file

Sleep(5000)

$Str = "can also use any icon" & @CRLF _
         & " from an external file" & @CRLF _
         & "or internally from registered libraries"


Tip($Str, "This is one more example...", 8, 1236) ; internal with 1236

Sleep(4000)

Tip("This is the body " _
         & "of the mesage " _
         & "with multiline concatenation example", _
         "This is the title ...",   8, 228)

Sleep(5000)

Tip("AutoIt v3 is a freeware BASIC-like scripting language " _
         & "designed for automating the Windows GUI and general scripting. " _
         & "It uses a combination of simulated keystrokes, " _
         & "mouse movement and window control manipulation " _
         & "in order to automate tasks in a way not possible " _
         & "or reliable with other languages e.g. VBScript and SendKeys ", _
        "This is an Example without icon for maximize the mesage area", 15, 0)

;----------------------------------------------------------------------------------------
Func Tip($Msg, $Title = "info", $Timeout = 3, $Icon = 2060)
    Local $FilePath = @ScriptDir & "\TrayTipGUI.au3"
    Local $Param = '"' & $Title & '" "' & $Msg & '" "' & $Timeout & '" "' & $Icon & '"'
    Run(FileGetShortName(@AutoItExe) & " " & FileGetShortName($FilePath) & " " & $Param)
EndFunc   ;==>Tip
;----------------------------------------------------------------------------------------

 

Example2.au3  -  Example for using TrayTipGUI

; https://www.autoitscript.com/forum/topic/209408-traytipgui-to-send-a-message-to-the-tray/
;Example2.au3  -  Example for using TrayTipGUI

#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7

Tip("so You can present the messages easy" & @CRLF & "  without title")

Sleep(3000)

Tip("as you see It is more efficient to write")

Sleep(3000)

Tip("in the sense that you don't need an icon and a title every time")

Sleep(4000)

Tip("Of course, if you need them, you can put them on", "New Title...", 5, 2132)

Sleep(4000)

;----------------------------------------------------------------------------------------
Func Tip($Msg, $Title = "info", $Timeout = 3, $Icon = 2060)
    Local $FilePath = @ScriptDir & "\TrayTipGUI.au3"
    Local $Param = '"' & $Title & '" "' & $Msg & '" "' & $Timeout & '" "' & $Icon & '"'
    Run(FileGetShortName(@AutoItExe) & " " & FileGetShortName($FilePath) & " " & $Param)
EndFunc   ;==>Tip
;----------------------------------------------------------------------------------------

 

[optional]
Make_icon_katalog.au3  -  Make_icon_katalog  create 9 X *.jpg files with icons from the dll libraries as albums for easy using in TrayTipGUI.au3

;https://www.autoitscript.com/forum/topic/209408-traytipgui-to-send-a-message-to-the-tray/

#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7
;Make_icon_katalog.au3
; creating icons albums from the dll libraries

#include <StaticConstants.au3>
#include <ScreenCapture.au3>

;Icons Library
Local $Ldll = "C:\Windows\System32\imageres.dll" ;$cnt = 334    --> 0000
$Ldll &= ";C:\Windows\system32\shell32.dll"         ;$cnt = 329 --> 1000
$Ldll &= ";C:\Windows\SysWOW64\wmploc.dll"         ;$cnt = 159  --> 2000
$Ldll &= ";C:\Windows\System32\ddores.dll"         ;$cnt = 149  --> 3000
$Ldll &= ";C:\Windows\System32\mmcndmgr.dll"     ;$cnt = 129    --> 4000
$Ldll &= ";C:\Windows\system32\ieframe.dll"         ;$cnt = 103 --> 5000
$Ldll &= ";C:\Windows\System32\compstui.dll"     ;$cnt = 101    --> 6000
$Ldll &= ";C:\Windows\System32\setupapi.dll"     ;$cnt =  62    --> 7000

$Ldll = StringSplit($Ldll, ";")

For $x = 1 To $Ldll[0]
    ConsoleWrite($Ldll[$x] & @CRLF)
    Example($Ldll[$x], $x)
Next

ShellExecute(@ScriptDir)
Exit

Func Example($IconLib, $Libfactor)
    $Libfactor = ($Libfactor - 1) * 1000
    Local $cnt = _WinAPI_ExtractIconEx($IconLib, -1, 0, 0, 0)
    ConsoleWrite("$cnt = " & $cnt & @CRLF)

    Local $C, $Col, $R, $Row, $BtnSz = 48
    $Col = (@DesktopWidth / 3 * 2) / $BtnSz
    $Row = Int($cnt / $Col)

    Local $hGUI = GUICreate($IconLib, $Col * $BtnSz + $BtnSz, $Row * $BtnSz, 0, 0, -1)

    Local $Icon[$cnt + 1]
    $Icon[0] = 0
    Local $i = 1
    For $R = 0 To $Row
        For $C = 0 To $Col
            ReDim $Icon[UBound($Icon) + 1]

            $Icon[$i] = GUICtrlCreateIcon($IconLib, -1 * $i, $C * $BtnSz, $R * $BtnSz, $BtnSz, $BtnSz)
            GUICtrlCreateLabel($i & " ", $C * $BtnSz, $R * $BtnSz, $BtnSz / 2, 12, $SS_RIGHT)
            ;GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
            GUICtrlSetTip($Icon[$i], "index " & $i)

            $i += 1
        Next
    Next

    GUISetState(@SW_SHOW)

    WinWaitActive($hGUI, "", 5)

    If $Libfactor = 0 Then $Libfactor = "0000"

    Local $WPos = WinGetPos($hGUI)
    ; [0]=X  [1]=Y  [2]=Width  [3]=Height

    ; Capture region
    _ScreenCapture_Capture(@ScriptDir & "\" & $Libfactor & ".jpg", $WPos[0], $WPos[1], $WPos[2], $WPos[3])

    GUIDelete($hGUI)
EndFunc   ;==>Example

 

Please, leave your comments and experiences here.  :)

Edited by ioa747
UpDate

I know that I know nothing

Link to comment
Share on other sites

Hi @ioa747,

I guess you will share some code, right 🤣 ?

Best regards
Sven

________________
Stay innovative!

Stay innovative!

Spoiler

🌍 Au3Forums

🎲 AutoIt (en) Cheat Sheet

📊 AutoIt limits/defaults

💎 Code Katas: [...] (comming soon)

🎭 Collection of GitHub users with AutoIt projects

🐞 False-Positives

🔮 Me on GitHub

💬 Opinion about new forum sub category

📑 UDF wiki list

✂ VSCode-AutoItSnippets

📑 WebDriver FAQs

👨‍🏫 WebDriver Tutorial (coming soon)

Link to comment
Share on other sites

Hi @ioa747,

besides the fact that there are some other tray tip scripts exists here in the forum 😅 , you did a nice job 👍 .
The style is nice and it moves fluently on my maschine.

One quick suggestionPlease remove the created *.jpg files after the example ends (in Make_icon_katalog.au3).

 image.png.45be38d74c6e5dfe5547c2fc6065f044.png

Best regards
Sven

________________
Stay innovative!

Stay innovative!

Spoiler

🌍 Au3Forums

🎲 AutoIt (en) Cheat Sheet

📊 AutoIt limits/defaults

💎 Code Katas: [...] (comming soon)

🎭 Collection of GitHub users with AutoIt projects

🐞 False-Positives

🔮 Me on GitHub

💬 Opinion about new forum sub category

📑 UDF wiki list

✂ VSCode-AutoItSnippets

📑 WebDriver FAQs

👨‍🏫 WebDriver Tutorial (coming soon)

Link to comment
Share on other sites

3 minutes ago, SOLVE-SMART said:

One quick suggestionPlease remove the created *.jpg files after the example ends (in Make_icon_katalog.au3).

the jpg file is useful because you can find the icon with one, e.g

from 1000.jpg which is 'C:\Windows\system32\shell32.dll'  index 260 = scissors

for using in Tip("Title", "Masage", 8, 1260)  ;)

I know that I know nothing

Link to comment
Share on other sites

Hi @ioa747,

yes I saw this in your three files, but I simple mean you spread new files on the system without any hint or removing them. That's what I don't like.
No big deal, don't worry. Just a suggestion of how to handle such things (IMO).


Nevertheless, good job 😀 .

Best regards
Sven

________________
Stay innovative!

Stay innovative!

Spoiler

🌍 Au3Forums

🎲 AutoIt (en) Cheat Sheet

📊 AutoIt limits/defaults

💎 Code Katas: [...] (comming soon)

🎭 Collection of GitHub users with AutoIt projects

🐞 False-Positives

🔮 Me on GitHub

💬 Opinion about new forum sub category

📑 UDF wiki list

✂ VSCode-AutoItSnippets

📑 WebDriver FAQs

👨‍🏫 WebDriver Tutorial (coming soon)

Link to comment
Share on other sites

@SOLVE-SMART  Thanks for  suggestion

 

3 hours ago, ioa747 said:

Make_icon_katalog  create 9 X *.jpg files

fix-it  :) 

2 hours ago, SOLVE-SMART said:

The style is nice and it moves fluently on my maschine.

Out of curiosity what Display resolution you have? if other from 1920X1080

what value give line 37

;Get DeskTop size
    Local $DTs = WinGetPos("[CLASS:Shell_TrayWnd]")
    ConsoleWrite("X=" & $DTs[0] & " Y=" & $DTs[1] & " W=" & $DTs[2] & " H=" & $DTs[3] & @CRLF)
    ; X=0 Y=1040 W=1920 H=40 * <--- main value

because I only tested it in 1920X1080  :blink:

Thanks again!

I know that I know nothing

Link to comment
Share on other sites

@ioa747:

6 hours ago, ioa747 said:

Out of curiosity what Display resolution you have? if other from 1920X1080

what value give line 37

ConsoleWrite("X=" & $DTs[0] & " Y=" & $DTs[1] & " W=" & $DTs[2] & " H=" & $DTs[3] & @CRLF)

because I only tested it in 1920X1080  :blink:

It worked fine on a 3440x1440 UltraWide monitor (curved).
The console output is: "X=0 Y=1410 W=3440 H=30" which is correct as far as I understood 👍 .

Best regards
Sven

________________
Stay innovative!

Edited by SOLVE-SMART

Stay innovative!

Spoiler

🌍 Au3Forums

🎲 AutoIt (en) Cheat Sheet

📊 AutoIt limits/defaults

💎 Code Katas: [...] (comming soon)

🎭 Collection of GitHub users with AutoIt projects

🐞 False-Positives

🔮 Me on GitHub

💬 Opinion about new forum sub category

📑 UDF wiki list

✂ VSCode-AutoItSnippets

📑 WebDriver FAQs

👨‍🏫 WebDriver Tutorial (coming soon)

Link to comment
Share on other sites

1 hour ago, SOLVE-SMART said:

It worked fine on a 3440x1440 UltraWide monitor (curved).
The console output is: "X=0 Y=1410 W=3440 H=30" which is correct as far as I understood 👍 .

:thumbsup:   that is great !!

Thank you!

I know that I know nothing

Link to comment
Share on other sites

After some time of using it I realized that makes the title optional is more efficient

Example2.au3  - makes the title optional

;https://www.autoitscript.com/forum/topic/209408-traytipgui-to-send-a-message-to-the-tray/

#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7
;Example2.au3
; Example for using TrayTipGUI


Tip("so You can present the messages easy" & @CRLF & "  without title")

Sleep(3000)

Tip("as you see It is more efficient to write")

Sleep(3000)

Tip("in the sense that you don't need an icon and a title every time")

Sleep(4000)

Tip("Of course, if you need them, you can put them on","New Title...",5,2132)

Sleep(4000)

;----------------------------------------------------------------------------------------
Func Tip($Msg, $Title = "info", $Timeout = 3, $Icon = 2060)
    Local $FilePath = @ScriptDir & "\TrayTipGUI.au3"
    Local $Param = '"' & $Title & '" "' & $Msg & '" "' & $Timeout & '" "' & $Icon & '"'
    Run(FileGetShortName(@AutoItExe) & " " & FileGetShortName($FilePath) & " " & $Param)
EndFunc   ;==>Tip
;----------------------------------------------------------------------------------------

 

I know that I know nothing

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...