AHK Countdown Tooltip

Applies to:
  • Microsoft Windows 7 Enterprise
  • AutoHotkey (see code for AHK version)

What?
Someone suggested an app that counts the days I have left serving my notice. I thought I'd go one better and have it calculate to the nearest second. I call this latest app "byeBU" and this is version 0.4 Beta (unofficial app).

Why?
Something to do...

How?
The following code is using AutoHotkey (AutoIt) and is the source code as compiling it wouldn't be much use to anyone else unless they work for the same company and they're leaving on the same date at the same time. Amend the "FinalDate" value to when you leave, compile the code into an executable, and schedule it as a windows task for when you are logged in:
;
; AutoHotkey Version: 1.0.47.06
; Language:     English
; Platform:     Win9x/XP
; Author:       Joel Lipman <This email address is being protected from spambots. You need JavaScript enabled to view it.>
; Date Created: 15-July-2014
;
; Script Function:
;       Just a countdown for my last days at BU.
;
; **********************************************************************************************************************************************************************
; DEFAULT INITIALIZATION
; **********************************************************************************************************************************************************************

        #NoEnv                          ; Recommended for performance and compatibility with future AutoHotkey releases.
        #SingleInstance Force           ; Skips the prompt that a current instance is running and overwrites this one with a fresh instance of this program
        SendMode Input                  ; Recommended for new scripts due to its superior speed and reliability.
        SetWorkingDir %A_ScriptDir%     ; Ensures a consistent starting directory.
        SetFormat, float, 0.2           ; Round any floats to two decimals

; **********************************************************************************************************************************************************************
; DECLARE GLOBALS
; **********************************************************************************************************************************************************************

        ; Program title
        ThisProgram:="ByeBU Countdown"

        ; Program version
        ThisVersion:="0.3 Beta"

        ; My leaving date
        FinalDate := "2014" "08" "29" "13" "00" "00"

        ; Background image to change to during the running of this program
        DesktopBackgroundImage1:="\\bournemouth.ac.uk\data\Staff\Home\jlipman\My Pictures\byeBU\byeBU_byPChristopher.bmp"

        ; Background image to revert to once program ends
        DesktopBackgroundImage2:="\\bournemouth.ac.uk\data\Staff\Home\jlipman\My Pictures\Win7_ScrSvr\BU_Core_CMYKportraitbigwithborder.jpg"

        ; Default Message reference
        ThisMessageIndex:=0

; **********************************************************************************************************************************************************************
; SETUP TRAY ICON
; **********************************************************************************************************************************************************************

        Menu, Tray, Tip, %ThisProgram% v%ThisVersion%
        GoSub, TrayMenu

; **********************************************************************************************************************************************************************
; RUN PROGRAM
; **********************************************************************************************************************************************************************

        ; set up array of jokes
        Joke1:="I pretend to work here, work pretends to pay me."
        Joke2:="He sets low personal standards and then consistently fails to achieve them."
        Joke3:="If he were any more stupid, he'd have to be watered twice a week."
        Joke4:="He has two brain cells, one is lost the other is out looking for it."
        Joke5:="If you gave him a penny for his thoughts, you would get change."
        Joke6:="The gates are down, the lights are flashing, but the train ain't coming."
        Joke7:="This employee is depriving a village somewhere of an idiot."
        Joke8:="The wheel is turning but the hamster is dead."
        Joke9:="When his IQ reaches 50, he should sell, sell, sell."
        Joke10:="Not so much of a has-been, more of a definite won't be."
        Joke11:="If you see two people talking and one looks bored, he's the other one."

        ; make program select one joke in this instance
        Random, JokeIndex, 1, 11
        ThisJoke:=Joke%JokeIndex%

        ; set the background image
        DllCall("SystemParametersInfo", UInt, 0x14, UInt, 0, Str, DesktopBackgroundImage1, UInt, 1)

        ; Run tooltip messages
        SetTimer, UpdateMessage, 10000
        GoSub, UpdateMessage

; **********************************************************************************************************************************************************************
; STOP CREATING THE GUI
; **********************************************************************************************************************************************************************

        RETURN

; **********************************************************************************************************************************************************************
; MAIN FUNCTIONS
; **********************************************************************************************************************************************************************

        UpdateMessage:

                ; TOTALS
                ThisManySeconds:=DateDiff( A_Now, FinalDate, "s" )
                ThisManyMinutes:=Floor(ThisManySeconds/60)
                ThisManyHours:=Floor(ThisManySeconds/3600)
                ThisManyDays:=Floor(ThisManySeconds/86400)
                ThisManyWeeks:=Floor(ThisManySeconds/604800)
                ThisManyMinutesRemainder:=Mod(ThisManySeconds, 60)
                ThisManyHoursRemainder:=Mod(ThisManyMinutes, 60)
                ThisManyDaysRemainder:=Mod(ThisManyHours, 24)
                ThisManyWeeksRemainder:=Mod(ThisManyDays, 7)
                ThisManyWeeksMessage:=ThisManyWeeks " week" ( ThisManyWeeks==1?"":"s") " and " ThisManyWeeksRemainder " day" ( ThisManyWeeksRemainder==1?"":"s")
                ThisManyDaysMessage:=ThisManyDays " day" ( ThisManyDays==1?"":"s") " and " ThisManyDaysRemainder " hour" ( ThisManyDaysRemainder==1?"":"s")
                ThisManyHoursMessage:=ThisManyHours " hour" ( ThisManyHours==1?"":"s") " and " ThisManyHoursRemainder " minute" ( ThisManyHoursRemainder==1?"":"s")
                ThisManyMinutesMessage:=ThisManyMinutes " minute" ( ThisManyMinutes==1 ?"":"s") " and " ThisManyMinutesRemainder " second" ( ThisManyMinutesRemainder==1?"":"s")

                ; WORKING TOTALS ; minus weekends, sleep and time not at work
                ThisManyWorkingSeconds:=DateDiff( A_Now, FinalDate, "s" ) - ((ThisManyDays - (ThisManyWeeks*2)) * 59760)
                ThisManyWorkingMinutes:=Floor(ThisManyWorkingSeconds/60)
                ThisManyWorkingHours:=Floor(ThisManyWorkingSeconds/3600)
                ThisManyWorkingDays:=Floor(ThisManyWorkingSeconds/86400)
                ThisManyWorkingDaysIn:=ThisManyDays - (ThisManyWeeks*2) ; days you have to be in NOT a seconds to days conversion
                ThisManyWorkingWeeks:=Floor(ThisManyWorkingSeconds/604800)
                ThisManyWorkingMinutesRemainder:=Mod(ThisManyWorkingSeconds, 60)
                ThisManyWorkingHoursRemainder:=Mod(ThisManyWorkingMinutes, 60)
                ThisManyWorkingDaysRemainder:=Mod(ThisManyWorkingHours, 24)
                ThisManyWorkingWeeksRemainder:=Mod(ThisManyWorkingDays, 7)
                ThisManyWorkingWeeksMessage:=ThisManyWorkingWeeks " week" ( ThisManyWorkingWeeks==1?"":"s") " and " ThisManyWorkingWeeksRemainder " day" ( ThisManyWorkingWeeksRemainder==1?"":"s")
                ThisManyWorkingDaysMessage:=ThisManyWorkingDays " day" ( ThisManyWorkingDays==1?"":"s") " and " ThisManyWorkingDaysRemainder " hour" ( ThisManyWorkingDaysRemainder==1?"":"s")
                ThisManyWorkingDaysInMessage:=ThisManyWorkingDaysIn " day" ( ThisManyWorkingDays==1?"":"s") " you actually have to be in."
                ThisManyWorkingHoursMessage:=ThisManyWorkingHours " hour" ( ThisManyWorkingHours==1?"":"s") " and " ThisManyWorkingHoursRemainder " minute" ( ThisManyWorkingHoursRemainder==1?"":"s")
                ThisManyWorkingMinutesMessage:=ThisManyWorkingMinutes " minute" ( ThisManyWorkingMinutes==1 ?"":"s") " and " ThisManyWorkingMinutesRemainder " second" ( ThisManyWorkingMinutesRemainder==1?"":"s")

                ; MESSAGES
                Message0:="All's well at " A_Hour ":" A_Min " on " A_DDDD ", " A_DD " " A_MMMM " " A_YYYY "`n`nAnd it's time for that gentle reminder..."
                Message1:="In total...`nYou have " ThisManyWeeksMessage " left at BU.`n`nIn more detail:`n • " ThisManyDaysMessage "`n • " ThisManyHoursMessage "`n • " ThisManyMinutesMessage
                Message2:="You have " ThisManyWorkingDaysInMessage "`n`nIn terms of working time:`n • " ThisManyWorkingWeeksMessage "`n • " ThisManyWorkingDaysMessage "`n • " ThisManyWorkingHoursMessage "`n • " ThisManyWorkingMinutesMessage
                Message3:="Comments from the employee performance evaluation:"

                If ThisMessageIndex = 0
                        TrayTip, ByeBU, %Message0%,10,1

                If ThisMessageIndex = 1
                        TrayTip, ByeBU, %Message1%,10,1

                If ThisMessageIndex = 2
                        TrayTip, ByeBU, %Message2%,10,1

                If ThisMessageIndex = 3
                {
                        TrayTip, ByeBU, %Message3%`n`n`"%ThisJoke%`",10,1
                        SetTimer, UpdateMessage, Off
                        Sleep, 12000
                        GoSub, GoExit
                }

                ThisMessageIndex++

        Return

        DateDiff( startdate, enddate, units="d" ) {
                If units NOT IN s,sec,second,seconds,m,min,minute,minutes,h,hour,hours,d,day,days
                        units := "d" ; default to days
                Else StringLeft, units, units, 1
                enddate -= startdate, %units%
                return enddate
        }

; **********************************************************************************************************************************************************************
; TRAY FUNCTIONS
; **********************************************************************************************************************************************************************

        TrayMenu:
                Menu, Tray, NoStandard                  ; Disable standard menu items
                Menu, Tray, Add, Restart, Restart       ; Restart/Reload Script
                Menu, Tray, Add, Exit, GuiClose         ; Terminate script
        Return

; **********************************************************************************************************************************************************************
; END PROGRAM
; **********************************************************************************************************************************************************************

        Restart:
                Reload

        GoExit:
        GuiClose:
                DllCall("SystemParametersInfo", UInt, 0x14, UInt, 0, Str, DesktopBackgroundImage2, UInt, 1)
                Gui, Destroy
        ExitApp

Screenshots:
On the basis that my final working date for this is 29-August-2014 @ 13:00.









Credit where Credit is Due:


Feel free to copy, redistribute and share this information. All that we ask is that you attribute credit and possibly even a link back to this website as it really helps in our search engine rankings.

Disclaimer: The information on this website is provided without warranty and any content is merely the opinion of the author. Please try to test in development environments prior to adapting them to your production environments. The articles are written in good faith and, at the time of print, are working examples used in a commercial setting.

Thank you for visiting and, as always, we hope this website was of some use to you!

Kind Regards,

Joel Lipman
www.joellipman.com

Related Articles

Joes Revolver Map

Accreditation

Badge - Certified Zoho Creator Associate
Badge - Certified Zoho Creator Associate

Donate & Support

If you like my content, and would like to support this sharing site, feel free to donate using a method below:

Paypal:
Donate to Joel Lipman via PayPal

Bitcoin:
Donate to Joel Lipman with Bitcoin - Valid till 8 May 2022 3QnhmaBX7LQSRsC9hh6Je9rGQKEGNQNfPb
© 2021 Joel Lipman .com. All Rights Reserved.