Set-StrictMode -Version 'latest'
$InformationPreference = [Management.Automation.ActionPreference]::Continue
Add-Type -MemberDefinition @'
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);
[DllImport("User32.Dll", EntryPoint = "SendMessageTimeout")]
public static extern IntPtr SendMessageTimeout([In] IntPtr hWnd, [In] uint message, [In] int wParam, [In] string lParam, [In] uint flags, [In] uint timeout, [Out][Optional] IntPtr result);
'@ -Name "NativeMethods" -Namespace "Win32" -PassThru | Out-Null
[UInt32]$WM_SETTINGCHANGE = 0x001A
[UInt32]$WM_THEMECHANGED = 0x031A
[UInt32]$WM_NOTIFY = 0x4E
[UInt32]$HWND_BROADCAST = 0xFFFF
[int]$SMTO_NORMAL = 0x0000 # The calling thread is not prevented from processing other requests while waiting for the function to return.
[int]$TimeoutForMessageSend = 2000
[IntPtr]$result = [IntPtr]::Zero
## Some Windows settings changes related to the taskbar go here. Left them out for brevity.
Write-Information 'Finding Shell_TrayWnd window.'
[IntPtr]$trayPointer = [Win32.NativeMethods]::FindWindow("Shell_TrayWnd", $null)
Write-Information 'Sending messages to notification area window and broadcast.'
[Win32.NativeMethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, $null, $null, $SMTO_NORMAL, $TimeoutForMessageSend, $result) | Out-Null
[Win32.NativeMethods]::SendMessageTimeout($HWND_BROADCAST, $WM_THEMECHANGED, $null, $null, $SMTO_NORMAL, $TimeoutForMessageSend, $result) | Out-Null
[Win32.NativeMethods]::SendMessageTimeout($HWND_BROADCAST, $WM_NOTIFY, $null, $null, $SMTO_NORMAL, $TimeoutForMessageSend, $result) | Out-Null
[Win32.NativeMethods]::SendMessageTimeout($trayPointer, $WM_SETTINGCHANGE, $null, $null, $SMTO_NORMAL, $TimeoutForMessageSend, $result) | Out-Null
[Win32.NativeMethods]::SendMessageTimeout($trayPointer, $WM_THEMECHANGED, $null, $null, $SMTO_NORMAL, $TimeoutForMessageSend, $result) | Out-Null
[Win32.NativeMethods]::SendMessageTimeout($trayPointer, $WM_NOTIFY, $null, $null, $SMTO_NORMAL, $TimeoutForMessageSend, $result) | Out-Null
<#
# Alternatively...
[Win32.NativeMethods]::SendMessage($HWND_BROADCAST, $WM_SETTINGCHANGE, $null, 0) | Out-Null
[Win32.NativeMethods]::SendMessage($trayPointer, $WM_SETTINGCHANGE, 0, 0) | Out-Null
[Win32.NativeMethods]::SendMessage($trayPointer, $WM_THEMECHANGED, 0, 0) | Out-Null
[Win32.NativeMethods]::SendMessage($trayPointer, $WM_NOTIFY, 0, 0) | Out-Null
#>