I am playing around with powershell and am changing some taskbar settings by changing the registry key. For example i have written an autohide enable disable function.
$autoHideSettingsPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects2";
$autoHideValueName = "Settings";
Function toggleAutohideRegistrySettings($enable)
{
$key = Get-ItemProperty -Path $autoHideSettingsPath -Name $autoHideValueName;
Write-Host "key is: " + $key
if($enable)
{
$key.$autoHIdeValueName[8] = $key.$autoHideValueName[8] -bor 1;
}else{
$key.$autoHIdeValueName[8] = $key.$autoHideValueName[8] -band 0;
}
Set-ItemProperty -Path $autoHideSettingsPath -Name $autoHideValueName -Value $key.$autoHideValueName;
}
The change in registry works perfectly. But to take effect i need to restart the explorer.exe. Which i can obviously also do in PS... but i noticed that when you apply the autohide settings in the menue (the mouse way), the explorer.exe is not being restarted.
So my question is: how do i apply the changes to the taskbar in the PS, without restarting the explorer.exe?
I've used the script above to send message to applications that there are new settings from the registry. Not all application can receive this message but I think explore does.
Give it a try, calling it after registry settings are applied:
$sign = @"
using System;
using System.Runtime.InteropServices;
public static class RegUpdate
{
private const int HWND_BROADCAST = 0xffff;
private const int WM_WININICHANGE = 0x001a, WM_SETTINGCHANGE = WM_WININICHANGE, INI_INTL = 1;
[DllImport("user32.dll")]
private static extern int SendMessage(int hWnd, uint wMsg, uint wParam, uint lParam);
public static string SendM()
{
try
{
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, INI_INTL);
return "0";
}
catch (Exception ex)
{
return (ex.Message);
}
}
}
"@
$type = Add-Type -TypeDefinition $sign -Language CSharp -PassThru
$type::SendM()
来源:https://stackoverflow.com/questions/12669294/powershell-apply-new-settings-to-taskbar