powershell применить новые настройки к панели задач

Я играю с powershell и меняю некоторые настройки панели задач, изменяя раздел реестра. Например, я написал функцию отключения автоматического скрытия.

$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;
}

Изменение в реестре работает отлично. Но для вступления в силу мне нужно перезапустить explorer.exe. Что я, очевидно, также могу сделать в PS ... но я заметил, что когда вы применяете настройки автоматического скрытия в меню (путем мыши), explorer.exe не перезапускается.

Итак, мой вопрос: как мне применить изменения к панели задач в PS, не перезапуская explorer.exe?


person scigor    schedule 01.10.2012    source источник


Ответы (1)


Я использовал приведенный выше сценарий для отправки сообщения приложениям о новых настройках из реестра. Не все приложения могут получать это сообщение, но я думаю, что explore делает это.

Попробуйте, вызвав его после применения настроек реестра:

$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()
person CB.    schedule 01.10.2012
comment
Это может показаться тривиальным, но как мне вызвать эту функцию? И нет ли способа сделать это в родной оболочке без участия С#? - person scigor; 01.10.2012
comment
Вы можете сохранить его как Send-HWNDMessage.ps1 в своем $pwd и вызвать из powershell как `send-HWNDmessage. P/Invoke можно сделать только через add-type. Я не знаю никакой родной команды для этого. Дайте мне знать, если это работает. - person CB.; 01.10.2012
comment
Это не. Я также нашел powershell.com/cs/media/p/8322.aspx где автор утверждает, что он может обновить настройки проводника, хотя, похоже, не работает с автоскрытием. - person scigor; 01.10.2012
comment
Извините... попробуйте дождаться других ответов. Удачи. - person CB.; 01.10.2012