Jump to content

System Tray Messages


Melba23
 Share

Recommended Posts

  • Moderators

After the Tray Message Box UDF that Valuater provided a few days ago, I hesitated to post this rather more complex script on the same theme. But I thought I might as well go public as it has a number of differences beyond the obvious one of size!

The principle of the script is much the same; your message is displayed in a "Toast" appearing from the system tray. However, in this case the colours and font size of the title bar and main window are user-definable, as are the text justification of the message and the delay before the Toast hides again (which can be cut short using a close button if required). But perhaps the main differences are that these Toasts will display correctly wherever the taskbar is around the screen (you can reposition the taskbar to the top or to either side, although I do not know many people who do) and that the Toasts are sized automatically to fit the message to be displayed.

The main UDF contains 3 functions: _Toast_Set to define the style, colours and font for subsequent Toasts; _Toast_Show to display the Toast and to set the delay before the script resumes; and _Toast_Hide to make it disappear. The script is pretty well commented and there is an example to crib from if necessary ;-):

#include-once

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <Memory.au3>

#include <GetDefaultFont.au3>
#include <LabelSize.au3>

Global $aDefMsgBoxFont = _GetDefaultFont()
Global $sDef_Toast_Font_Name = $aDefMsgBoxFont[0]
Global $iDef_Toast_Font_Size = $aDefMsgBoxFont[1]

; Declare Toast Global variables
Global $hToast_handle       = 0
Global $sToast_Direction     = "Up"
Global $iToast_Style         = $SS_CENTER
Global $iToast_Header_BkCol  = _WinAPI_GetSysColor($COLOR_WINDOWTEXT)
Global $iToast_Header_Col   = _WinAPI_GetSysColor($COLOR_WINDOW)
Global $iToast_Header_Bold   = 0
Global $iToast_Message_BkCol = $iToast_Header_Col
Global $iToast_Message_Col   = $iToast_Header_BkCol
Global $sToast_Font_Name     = $sDef_Toast_Font_Name
Global $iToast_Font_Size     = $iDef_Toast_Font_Size

;Example

Local $sMsg, $hProgress, $aRet[2]

$sMsg  = "The message text goes in this area" & @CRLF & @CRLF
$sMsg &= "This Toast uses the System colours and font"

$aRet = _Toast_Show("The Title text goes here", $sMsg, 5)
ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)
_Toast_Hide()

$sMsg  = "This Toast uses colours and font defined in a _Toast_Set call. "
$sMsg &= "The header text is also displayed in bold weight" & @CRLF & @CRLF
$sMsg &= "Subsequent Toasts will use these values until they are reset by another _Toast_Set call" & @CRLF & @CRLF
$sMsg &= "The next Toast has a very small message to show the pre-set minimum size"

_Toast_Set(5, 0xFF00FF, 0xFFFF00, 0x0000FF, 0xFFFFFF, 10, "Arial")
$aRet = _Toast_Show("User-defined Colours and Bold Header", $sMsg, 10)
ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)
_Toast_Hide()

$aRet = _Toast_Show("Mini Size", "Tiny", 2)
ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)
_Toast_Hide()

$sMsg  = "These lines are of medium length" & @CRLF & @CRLF
$sMsg &= "The width is set by the longest" & @CRLF & @CRLF
$sMsg &= "No wrapping occurs here" & @CRLF & @CRLF 
$sMsg &= "Note increased font size"

_Toast_Set(-1, -1, -1, -1, -1, 15)
$aRet = _Toast_Show("Mid Width", $sMsg, 5)
ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)
_Toast_Hide()

$sMsg  = "This is a very long message set to left justified and a much larger font using _Toast_Set" & @CRLF & @CRLF
$sMsg &= "The Toast is automatically set to the maximum preset width and the message text "
$sMsg &= "is wrapped as necessary to fit within the margins of the Toast" & @CRLF & @CRLF
$sMsg &= "The Message area colours have been changed, "
$sMsg &= "but the Header colours have been left unaltered although the text is now normal weight" & @CRLF & @CRLF
$sMsg &= "Note the closure [X] on the title bar.  This Toast will time out in 30 secs "
$sMsg &= "but clicking the [X] will resume the script immediately" & @CRLF & @CRLF
$sMsg &= "Toasts adjust automatically in height to display all of the message "
$sMsg &= "regardless of the font, the number of lines or whether wrapping occurs"

_Toast_Set(0, -1, 0xFFFF00, 0x00FF00, 0x000000, 15, "Courier New")
$aRet = _Toast_Show("Max Width and Normal Header", $sMsg, -30)
ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)
_Toast_Hide()

$sMsg  = "This Toast has several blank lines inserted. "
$sMsg &= "This can be useful if you want to leave space to add other controls, "
$sMsg &= "such as a progress bar, to the Toast once it is displayed" & @CRLF & @CRLF & @CRLF & @CRLF
$sMsg &= "The Toast size is returned by the function so you can calculate "
$sMsg &= "where to place the other controls.  "
$sMsg &= "This example script writes the size in the SciTE console" & @CRLF & @CRLF
$sMsg &= "Note that Toast colours and font have been reset to Default"

_Toast_Set(Default)
$aRet = _Toast_Show("Progress Bar", $sMsg, 0)
ConsoleWrite("Toast size: " & $aRet[0] & " x " & $aRet[1] & @CRLF)
$hProgress = GUICtrlCreateProgress(10, 65, $aRet[0] - 20, 20)
For $i = 1 To 100
    GUICtrlSetData($hProgress, $i)
    Sleep(50)
Next
Sleep(5000)
_Toast_Hide()

Exit

; End of example

; #FUNCTION# ======================================================================
; Name............: _Toast_Set
; Description ....: Sets the centring parameter, and optionally the colours and font, for _Toast_Show function calls
; Syntax..........: _Toast_Set($vStyle, [$iHdr_BkCol, [$iHdr_Col, [$iMsg_BkCol, [$iMsg_Col, [$sFont_Size, [$iFont_Name]]]]]])
; Parameters .....: $vStyle     -> 0 = Left justified, 1 = Centred (Default), 2 = Right justified
;                                 Can use $SS_LEFT, $SS_CENTER, $SS_RIGHT
;                                 + 4 = Header text in bold
;                       >>>>>    Setting this parameter to' Default' will reset ALL parameters to default values     <<<<<
;                  $iHdr_BkCol  -> The colour for the title bar background
;                  $iHdr_Col    -> The colour for the title bar text 
;                  $iMsg_BkCol  -> The colour for the message background
;                  $iMsg_Col    -> The colour for the message text
;                                 Omitting a colour parameter or setting it to -1 leaves it unchanged
;                                 Setting a colour parameter to Default resets the system colour
;                  $iFont_Size  -> The font size in points to use for the Toast
;                  $sFont_Name  -> The font to use for the Toast
;                                 Omitting a font parameter or setting size to -1 or name to "" leaves it unchanged
;                                 Setting a font parameter to Default resets the system message box font or size
; Requirement(s)..: v3.2.12.1 or higher
; Return values ..: Success:    Returns 0
; Author .........: Melba23
; Example.........; Yes
; ================================================================================

Func _Toast_Set($vStyle, $iHdr_BkCol = -1, $iHdr_Col = -1, $iMsg_BkCol = -1, $iMsg_Col = -1, $iFont_Size = -1, $sFont_Name = "")

; Set parameters
    If $vStyle = Default Then
        $iToast_Style        = $SS_CENTER
        $iToast_Header_BkCol  = _WinAPI_GetSysColor($COLOR_WINDOWTEXT)
        $iToast_Header_Col  = _WinAPI_GetSysColor($COLOR_WINDOW)
        $iToast_Message_BkCol = $iToast_Header_Col
        $iToast_Message_Col   = $iToast_Header_BkCol
        $sToast_Font_Name    = $sDef_Toast_Font_Name
        $iToast_Font_Size    = $iDef_Toast_Font_Size
        Return
    ElseIf $vStyle = -1 Then
    ; Do nothing
    Else
        $iToast_Style = $vStyle
    EndIf
    
    Select
        Case $iHdr_BkCol = Default
            $iToast_Header_BkCol = _WinAPI_GetSysColor($COLOR_WINDOWTEXT)
        Case $iHdr_BkCol >= 0 And $iHdr_BkCol <= 0xFFFFFF
            $iToast_Header_BkCol = $iHdr_BkCol
        Case Else
    EndSelect
    
    If $iHdr_Col <> -1 Then
        If StringLeft($iHdr_Col, 1) = "+" Then
            $iToast_Header_Bold = 1
            $iHdr_Col = StringTrimLeft($iHdr_Col, 1)
        Else
            $iToast_Header_Bold = 0
        EndIf
        Select
            Case $iHdr_Col = Default
                $iToast_Header_Col  = _WinAPI_GetSysColor($COLOR_WINDOW)
                $iToast_Header_Bold = 0
            Case $iHdr_Col >= 0 And $iHdr_Col <= 0xFFFFFF
                $iToast_Header_Col = $iHdr_Col
            Case Else
        EndSelect
    EndIf
    
    Select
        Case $iMsg_BkCol = Default
            $iToast_Message_BkCol = _WinAPI_GetSysColor($COLOR_WINDOW)
        Case $iMsg_BkCol >= 0 And $iMsg_BkCol <= 0xFFFFFF
            $iToast_Message_BkCol = $iMsg_BkCol
        Case Else
    EndSelect
    
    Select
        Case $iMsg_Col = Default
            $iToast_Message_Col = _WinAPI_GetSysColor($COLOR_WINDOWTEXT)
        Case $iMsg_Col >= 0 And $iMsg_Col <= 0xFFFFFF
            $iToast_Message_Col = $iMsg_Col
        Case Else
    EndSelect
    
    Select
        Case $iFont_Size = Default
            $iToast_Font_Size = $iDef_Toast_Font_Size
        Case $iFont_Size > 0
            $iToast_Font_Size = $iFont_Size
        Case Else
    EndSelect
    
    Select
        Case $sFont_Name = Default
            $sToast_Font_Name = $sDef_Toast_Font_Name
        Case $sFont_Name = ""
        Case Else
            $sToast_Font_Name = $sFont_Name
    EndSelect
    
EndFunc; => _Toast_Set

; #FUNCTION# =================================================================================
; Name............: _Toast_Show
; Description ....: Shows a slice message from the systray
; Syntax..........: _Toast_Show($sTitle, $sMessage, [$iDelay])
; Parameters .....: $sTitle     -> Text to display on Title bar
;                  $sMessage    -> Text to display in Toast body
;                  $iDelay      -> The pause in seconds before the script continues (Default = 0)
;                                 If negative, an [X] is added to the title bar. Clicking [X] continues immediately
; Requirement(s)..: v3.2.12.1 or higher
; Return values ..: Success:    Returns 2-element array: [Toast width, Toast height]
;                  Failure: Returns -1 -- Error 1 = Toast GUI creation failed
;                                         -- Error 2 = Taskbar not found
; Author .........: Melba23, based on some original code by GioVit for the Toast, Prog@ndy and Zedna for the [X]
; Example.........; Yes
; ===========================================================================================

Func _Toast_Show($sTitle, $sMessage, $iDelay = 0)
    
; Define Local variables
    
    Local $iTitle_Height, $iTitle_Width, $iLabel_style
    Local $iClose_Height, $hClose_Pic, $hClose_Image 
    
; Define Local arrays               
    Local $aLabel_Pos[4], $aToast_XY[2], $aLines[1], $aLine_Len[1]
    
; Store current OnEventMode mode and set Message mode
    Local $nOldOpt = Opt('GUIOnEventMode', 0)
    
; Set default auto-sizing Toast widths
    Local $iToast_Width_max = 500
    Local $iToast_Width_min = 150
    
; Get message label size
    $aLabel_Pos = _Label_Size($sMessage, $iToast_Font_Size, $sToast_Font_Name, $iToast_Width_max - 20)
    
;Set line height for this font
    Local $iLine_Height = $aLabel_Pos[1]
    
; Set label size
    Local $iLabelwidth  = $aLabel_Pos[2]
    Local $iLabelheight = $aLabel_Pos[3]
    
; Set Toast size
    Local $iToast_Width = $iLabelwidth + 20
    If $iToast_Width < $iToast_Width_min Then
    ; Increase if below min size
        $iToast_Width = $iToast_Width_min
        $iLabelwidth  = $iToast_Width_min - 20
    EndIf
    
; Set title bar height to min of 19 to fit eventual [X]
    If $iLine_Height < 19 Then
        $iTitle_Height = 19
    Else
        $iTitle_Height = $iLine_Height
    EndIf
    
; Set Toast height as label height + title bar + bottom margin
    Local $iToast_Height = $iLabelheight + $iTitle_Height + 20
    
; Get Toast starting position and direction
    $aToast_XY = _Toast_Locate($iToast_Width, $iToast_Height)
        
; Create Toast slice 
    $hToast_handle = GUICreate("", $iToast_Width, $iToast_Height, $aToast_XY[0], $aToast_XY[1], $WS_POPUPWINDOW, $WS_EX_TOOLWINDOW)
    If @error Then
        $nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
        Return SetError(1, 0, -1)
    EndIf
        GUISetFont($iToast_Font_Size, 400, 0, $sToast_Font_Name)
        GUISetBkColor($iToast_Message_BkCol)
        
; Set centring parameter
    If BitAND($iToast_Style, 1) = 1 Then
        $iLabel_style = $SS_CENTER
    ElseIf BitAND($iToast_Style, 2) = 2 Then
        $iLabel_style = $SS_RIGHT
    Else
        $iLabel_style = $SS_LEFT
    EndIf
    
; Create background title bar and disable to permit eventual [X]
    GUICtrlCreateLabel("", 0, 0, $iToast_Width, $iTitle_Height)
        GUICtrlSetBkColor(-1, $iToast_Header_BkCol)
        GUICtrlSetState(-1, $GUI_DISABLE)
    
; Create closure [X] if needed - and set title bar width
    If $iDelay < 0 Then
    ; Create pic holder and fill with bin code
        $iClose_Height = Int(($iTitle_Height - 15) / 2)
        $hClose_Pic = GUICtrlCreatePic("", $iToast_Width - 30, $iClose_Height, 28, 15)
        $hClose_Image = _X_Bin()
        _Toast_BinToImage($hClose_Pic, $hClose_Image)
    ; Reduce title bar width to allow [X] to activate
        $iTitle_Width = $iToast_Width - 40
    Else
    ; Set placeholder and keep full width title bar
        $hClose_Pic = 9999
        $iTitle_Width  = $iToast_Width - 10
    EndIf
    
; Create Title label with bold text, centred vertically in case bar is higher than line
    GUICtrlCreateLabel($sTitle, 10, 0, $iTitle_Width, $iTitle_Height, $SS_CENTERIMAGE)
        GUICtrlSetBkColor(-1, $iToast_Header_BkCol)
        GUICtrlSetColor(-1, $iToast_Header_Col)
        If BitAND($iToast_Style, 4) = 4 Then GUICtrlSetFont(-1, $iToast_Font_Size, 600)
        
; Create Message label
    GUICtrlCreateLabel($sMessage, 10, 10 + $iLine_Height, $iLabelwidth, $iLabelheight)
        GUICtrlSetStyle(-1, $iLabel_Style)
        If $iToast_Message_Col <> Default Then GUICtrlSetColor(-1, $iToast_Message_Col)
    
; Show Toast GUI
    GUISetState(@SW_SHOW, $hToast_handle)
            
; Slide Toast Slice into view from behind systray
    Select
    Case $sToast_Direction = "Down"
        _Toast_Move(0, $iToast_Height)
    Case $sToast_Direction = "Up"
        _Toast_Move(0, -$iToast_Height)
    Case $sToast_Direction = "Left"
        _Toast_Move(-$iToast_Width, 0)
    Case $sToast_Direction = "Right"
        _Toast_Move($iToast_Width, 0)
    EndSelect
    
; Begin timeout counter
    Local $iTimeout_begin = TimerInit()

; Wait for timeout or closure
    While 1
        Local $aMsg = GUIGetMsg(1)
        
        If $aMsg[1] = $hToast_handle And $aMsg[0] = $hClose_Pic Then ExitLoop
        
    ; Timeout 
        If TimerDiff($iTimeout_begin) / 1000 >= Abs($iDelay) Then ExitLoop

    WEnd

; Reset OnEventMode mode
    $nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
    
; Create array to return Toast dimensions
    Dim $aToast_XY[2] = [$iToast_Width, $iToast_Height]
    
    Return $aToast_XY
    
EndFunc; => _Toast_Show

; #FUNCTION# ======================================================================
; Name............: _Toast_Hide
; Description ....: Hides a slice message from the systray
; Syntax..........: _Toast_Hide()
; Requirement(s)..: v3.2.12.1 or higher
; Return values ..: Success:    Returns 0
;                  Failure: Returns -1 -- Error 1 = Toast does not exist
; Author .........: Melba23, based on some original code by GioVit
; Example.........; Yes
; ================================================================================

Func _Toast_Hide()
    
; Define Local array
    Local $aToast_Pos[4]
    
; If no Toast to hide, return
    If $hToast_handle = 0 Then Return SetError(1, 0, -1)
    
; Get Toast data
    $aToast_Pos = WinGetPos($hToast_handle)
    
; Slide Toast back behind systray
    Select
    Case $sToast_Direction = "Down"
        _Toast_Move(0, -$aToast_Pos[1] - $aToast_Pos[3], 500)
    Case $sToast_Direction = "Up"
        _Toast_Move(0, @DesktopHeight - $aToast_Pos[1],  500)
    Case $sToast_Direction = "Left"
        _Toast_Move(@DesktopWidth - $aToast_Pos[0], 0,   500)
    Case $sToast_Direction = "Right"
        _Toast_Move(-$aToast_Pos[0] - $aToast_Pos[2], 0, 500)
    EndSelect

; Delete Toast slice
    GUIDelete($hToast_handle)
    
; Set flag for "no Toast"
    $hToast_handle = 0

EndFunc; => _Toast_Hide

; =================================================================================
; Internal functions
; =================================================================================

; Move the Toast in and out
Func _Toast_Move($iXpos, $iYpos, $iTimer = 1000)
    
; Define Local variables
    Local $iMoves, $iDeltaX, $iDeltaY
    
; Define Local array
    Local $aToast_Pos[4]
    
; Calculate number of moves needed
    $iMoves = Round($iTimer / 15)

; Set increments
    $iDeltaX = $iXpos/$iMoves
    $iDeltaY = $iYpos/$iMoves
    
; Get Toast position data
    $aToast_Pos = WinGetPos($hToast_handle)
    
; Slide Toast
    For $i = 1 To $iMoves; - 1
        WinMove($hToast_handle, "", $aToast_Pos[0] + $iDeltaX * $i, $aToast_Pos[1] + $iDeltaY * $i)
        Sleep(15)
    Next
    
EndFunc; => _Toast_Move

; -------

; Find Systray and determine Toast start position and movement direction
Func _Toast_Locate($iToast_Width, $iToast_Height)
    
; Define Local variable
    Local $iPrevMode
    
; Define Local arrays
    Local $aTray_Pos[4], $aToast_XY[2]

; Find systray
    $iPrevMode = AutoItSetOption("WinTitleMatchMode", 4)
    $aTray_Pos = WinGetPos("classname=Shell_TrayWnd")
    AutoItSetOption("WinTitleMatchMode", $iPrevMode)
    
; If error in finding systray
    If @error Then Return SetError(2, 0, -1)

; Determine direction of Toast motion and starting position
    If $aTray_Pos[1] > 0 Then
        $sToast_Direction = "Up"
        $aToast_XY[0] = @DesktopWidth - $iToast_Width - 10
        $aToast_XY[1] = $aTray_Pos[1]
    Elseif $aTray_Pos[0] > 0 Then
        $sToast_Direction = "Left"
        $aToast_XY[0] = $aTray_Pos[0]
        $aToast_XY[1] = @DesktopHeight - $iToast_Height - 10
    ElseIf $aTray_Pos[2] = @DesktopWidth Then
        $sToast_Direction = "Down"
        $aToast_XY[0] = @DesktopWidth - $iToast_Width - 10
        $aToast_XY[1] = $aTray_Pos[1] + $aTray_Pos[3] - $iToast_Height
    ElseIf $aTray_Pos[3] = @DesktopHeight Then
        $sToast_Direction = "Right"
        $aToast_XY[0] = $aTray_Pos[0] + $aTray_Pos[2] - $iToast_Width
        $aToast_XY[1] = @DesktopHeight - $iToast_Height - 10
    EndIf
    
    Return $aToast_XY

EndFunc; => _Toast_Locate

; ------------

; Adds the [X] to the title bar - Modified from an original script by Prog@ndy and Zedna
Func _Toast_BinToImage($CtrlId, ByRef $Binary)
    
    Local $hData, $pData, $pStream, $pBitmap, $hBitmap
    Local Const $STM_SETIMAGE = 0x0172, $IMAGE_BITMAP = 0, $SS_BITMAP = 0xE, $GWL_STYLE = -16
    
; Get bin data into structure
    Local $picdata = Binary($Binary)
    Local $piclength = BinaryLen($picdata)
    Local $picstruct = DllStructCreate("byte[" & $piclength & "]")
    DllStructSetData($picstruct, 1, $picdata)
; Get bin data into memory
    Local $picmemory = DllStructGetPtr($picstruct)
    $hData = _MemGlobalAlloc($piclength, 2)
    $pData = _MemGlobalLock($hData)
    _MemMoveMemory($picmemory, $pData, $piclength)
    _MemGlobalUnlock($hData)
; Create stream
    $pStream = DllCall( "ole32.dll", "int", "CreateStreamOnHGlobal", "int", $hData, "long", 1, "Int*", 0)
    $pStream = $pStream[3]
; Create image from stream
    _GDIPlus_Startup()
    $pBitmap = DllCall($ghGDIPDll, "int", "GdipCreateBitmapFromStream", "ptr", $pStream, "int*", 0)
    $pBitmap = $pBitmap[2]
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($pBitmap)
; Set image in control
    Local $hWnd = GUICtrlGetHandle($CtrlId)
    If $hWnd = 0 Then Return SetError(1, 0, -1)
    Local $oldStyle = DllCall("user32.dll", "long", "GetWindowLong", "hwnd", $hWnd, "int", $GWL_STYLE)
    If @error Then Return SetError(2, 0, -1)
    DllCall("user32.dll", "long", "SetWindowLong", "hwnd", $hWnd, "int", $GWL_STYLE, "long", BitOR($oldStyle[0], $SS_BITMAP))
    If @error Then Return SetError(3, 0, -1)
        Local $oldBmp = DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hWnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hBitmap)
    If @error Then Return SetError(4, 0, -1)
; Clear up
    If $oldBmp[0] <> 0 Then _WinAPI_DeleteObject($oldBmp[0])
    _GDIPlus_BitmapDispose($pBitmap)
    _GDIPlus_Shutdown()
    _WinAPI_DeleteObject($pStream)
    _MemGlobalFree($hData)
    DllStructSetData($picstruct, 1, 0)
    $picstruct = ""
    
EndFunc; =>_Toast_BinToImage

; ------------

Func _X_Bin()
    
; The [X] jpg in bin form

    Local $FileName = "0x"
    $FileName &= "ffd8ffe000104a46494600010101006000600000ffdb00430008060607060508"
    $FileName &= "0707070909080a0c140d0c0b0b0c1912130f141d1a1f1e1d1a1c1c20242e2720"
    $FileName &= "222c231c1c2837292c30313434341f27393d38323c2e333432ffdb0043010909"
    $FileName &= "090c0b0c180d0d1832211c213232323232323232323232323232323232323232"
    $FileName &= "323232323232323232323232323232323232323232323232323232323232ffc0"
    $FileName &= "001108000f001c03012200021101031101ffc4001f0000010501010101010100"
    $FileName &= "000000000000000102030405060708090a0bffc400b510000201030302040305"
    $FileName &= "0504040000017d01020300041105122131410613516107227114328191a10823"
    $FileName &= "42b1c11552d1f02433627282090a161718191a25262728292a3435363738393a"
    $FileName &= "434445464748494a535455565758595a636465666768696a737475767778797a"
    $FileName &= "838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7"
    $FileName &= "b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1"
    $FileName &= "f2f3f4f5f6f7f8f9faffc4001f01000301010101010101010100000000000001"
    $FileName &= "02030405060708090a0bffc400b5110002010204040304070504040001027700"
    $FileName &= "0102031104052131061241510761711322328108144291a1b1c109233352f015"
    $FileName &= "6272d10a162434e125f11718191a262728292a35363738393a43444546474849"
    $FileName &= "4a535455565758595a636465666768696a737475767778797a82838485868788"
    $FileName &= "898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4"
    $FileName &= "c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9"
    $FileName &= "faffda000c03010002110311003f00b3a169be154f0e6926e34fd10dc358c0f2"
    $FileName &= "19e088b9631a924ee19c9249c9f5a9f4dd0b4fd4adae278b4ff0a110b1fb597b"
    $FileName &= "189069cb82c257249134454310cbb32540217e7f2b87b5bed327d36c58ea7046"
    $FileName &= "c9696f13a3c72e55844aa47087ae3ae48adad3fc5f3e93696b6da76bda6da476"
    $FileName &= "d299f10da4e0dcb9182d3920f9991c606d001e00da9b12e6bea8f66ae1297b28"
    $FileName &= "3a4d3935adeda686e69f6be1796d8b5c587879b2e76482c2184c89d98c6db8c7"
    $FileName &= "9fee96271827692557cc7e2adb69b69e24b2fecbb7b386096c55d85ac6810b79"
    $FileName &= "920cf031d001f856f3dd698f24b2ff006969d6eaf21c456f6f3a45193d914ab1"
    $FileName &= "51df19207418180390f1b5e59dc6a160b6f7293ac569b0baab019f3646eea3fb"
    $FileName &= "c3b524e5d858ac361e3423284bded2eb4ec7ffd9"

    Return $FileName

    
EndFunc; =>_X_Bin()

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

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

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...