Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
A clock widget for PowerShell using the free Arction Gauge control
Function New-WPFClock {
## Generates a clock displaying the current system time
## Requires the Arction WPF Gauges, a free download from https://www.arction.com/free-gauges/
## Set the location of the Arction Gauges dll on line 26
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$false,Position=0)]
$Color = "SteelBlue",
[Parameter(Mandatory=$false,Position=1)]
[int]$Height = 300,
[Parameter(Mandatory=$false,Position=2)]
[int]$Width = 300,
[Parameter(Mandatory=$false,Position=3)]
[int]$FontSize = 30,
[Parameter(Mandatory=$false,Position=4)]
[switch]$AlwaysOnTop
)
# Load the required assemblies
Add-Type -AssemblyName PresentationFramework,PresentationCore
Try
{
Add-Type -Path "<path>\Arction.WPF.Gauges.dll" -ErrorAction Stop
}
Catch
{
$e = New-Object 'System.IO.FileLoadException' "Could not add the Arction.WPF.Gauges.dll. Ensure it is available"
$Category = [System.Management.Automation.ErrorCategory]::ObjectNotFound
$TargetObject = ""
$errorRecord = New-Object System.Management.Automation.ErrorRecord $e, $errorID, $Category, $TargetObject
$PSCmdlet.ThrowTerminatingError($errorRecord)
}
# Create the window
$Window = [System.Windows.Window]::new()
$Window.SizeToContent = [System.Windows.SizeToContent]::WidthAndHeight
$Window.AllowsTransparency = $true
$Window.Background = "Transparent"
$Window.WindowStyle = "None"
$Window.WindowStartupLocation = "CenterScreen"
If ($AlwaysOnTop)
{
$Window.Topmost = $true
}
# Create the Gauge
$Gauge = [Arction.Gauges.Gauge]::new()
$Gauge.Margin = 5
$Gauge.Height = $Height
$Gauge.Width = $Width
$Gauge.Fill = $Color
$Gauge.FontSize = $FontSize
$Gauge.Cursor = "Hand"
# Allow drag
$Gauge.Add_MouseLeftButtonDown({
$Window.DragMove()
})
# Close on right-click
$Gauge.Add_MouseRightButtonUp({
$Window.Close()
})
# Create the Hour Scale
$HourScale = New-object Arction.Gauges.Scale
$HourScale.AngleBegin = 60
$HourScale.AngleEnd = 60
$HourScale.RangeBegin = 1
$HourScale.RangeEnd = 13
$HourScale.Theme = "None"
$HourScale.MajorTickCount = 12
$HourScale.MinorTickCount = 0
$HourScale.TertiaryTickCount = 0
$HourScale.DialShape = [Arction.Gauges.Dials.DialShape]::DefaultNeedle
$HourScale.DialLengthFactor = 0.6
$HourScale.DialColor1 = "White"
$HourScale.Label = [System.Windows.Controls.TextBlock]::new()
$HourScale.ValueIndicator.Foreground = $Color
$HoursMajorTicks = New-Object Arction.Gauges.MajorTicksLine
$HoursMajorTicks.LabelOffset = -12
$HoursMajorTicks.OffsetA = -5
$HoursMajorTicks.TickThickness = -5
$HoursMajorTicks.FontWeight = "Bold"
$HoursMajorTicks.FontFamily = "Arial"
$HoursMajorTicks.TickStroke = "White"
$HoursMajorTicks.LabelBrush = "White"
$HourScale.MajorTicks = $HoursMajorTicks
# Create the Minute Scale
$MinuteScale = New-object Arction.Gauges.Scale
$MinuteScale.AngleBegin = 90
$MinuteScale.AngleEnd = 90
$MinuteScale.RangeBegin = 0
$MinuteScale.RangeEnd = 60
$MinuteScale.Theme = "None"
$MinuteScale.MajorTickCount = 60
$MinuteScale.MinorTickCount = 0
$MinuteScale.TertiaryTickCount = 0
$MinuteScale.DialShape = [Arction.Gauges.Dials.DialShape]::DefaultNeedle
$MinuteScale.DialLengthFactor = 0.8
$MinuteScale.DialColor1 = "White"
$MinutesMajorTicks = New-Object Arction.Gauges.MajorTicksLine
$MinutesMajorTicks.OffsetA = -4
$MinutesMajorTicks.OffsetB = -2
$MinutesMajorTicks.TickThickness = 2
$MinutesMajorTicks.LabelFormat = ""
$MinutesMajorTicks.TickStroke = "White"
$MinutesMajorTicks.LabelBrush = "White"
$MinuteScale.MajorTicks = $MinutesMajorTicks
# Create the Seconds Scale
$SecondsScale = New-object Arction.Gauges.Scale
$SecondsScale.AngleBegin = 90
$SecondsScale.AngleEnd = 90
$SecondsScale.RangeBegin = 0
$SecondsScale.RangeEnd = 60
$SecondsScale.Theme = "None"
$SecondsScale.MajorTickCount = 60
$SecondsScale.MinorTickCount = 0
$SecondsScale.TertiaryTickCount = 0
$SecondsScale.DialShape = [Arction.Gauges.Dials.DialShape]::Line
$SecondsScale.DialLengthFactor = 0.8
$SecondsDial = New-Object Arction.Gauges.Dials.Dial
$SecondsDial.MaxWidth = 5
$SecondsDial.Height = 28
$SecondsDial.AspectRatio = 0.2
$SecondsScale.Dial = $SecondsDial
$SecondsMajorTicks = New-Object Arction.Gauges.MajorTicksLine
$SecondsMajorTicks.OffsetA = -4
$SecondsMajorTicks.OffsetB = -2
$SecondsMajorTicks.TickThickness = 2
$SecondsMajorTicks.LabelFormat = ""
$SecondsMajorTicks.TickStroke = "White"
$SecondsMajorTicks.LabelBrush = "White"
$SecondsScale.MajorTicks = $SecondsMajorTicks
# Add the scales to the Gauge
$Gauge.PrimaryScale = $HourScale
$Gauge.SecondaryScales.Add($MinuteScale)
$Gauge.SecondaryScales.Add($SecondsScale)
# Add the Gauge to the window
$Window.AddChild($Gauge)
# Set the initial time values
$Gauge.PrimaryScale.Value = [System.DateTime]::Now.Hour
$Gauge.SecondaryScales[0].Value = [System.DateTime]::Now.Minute
$Gauge.SecondaryScales[1].Value = [System.DateTime]::Now.Second
# Start a dispatcher timer to update the clock every second
$TimerCode = {
$Gauge.PrimaryScale.Value = [System.DateTime]::Now.Hour
$Gauge.SecondaryScales[0].Value = [System.DateTime]::Now.Minute
$Gauge.SecondaryScales[1].Value = [System.DateTime]::Now.Second
}
$DispatcherTimer = New-Object -TypeName System.Windows.Threading.DispatcherTimer
$DispatcherTimer.Interval = [TimeSpan]::FromSeconds(1)
$DispatcherTimer.Add_Tick($TimerCode)
$DispatcherTimer.Start()
# Activate the window on load
$Window.Add_Loaded({
$This.Activate()
})
# Stop the dispatcher on close
$Window.Add_Closed({
$DispatcherTimer.Stop()
})
# Display the window
$null = $window.Dispatcher.InvokeAsync{$window.ShowDialog()}.Wait()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment