Параметр реестра не вступает в силу после его изменения - PullRequest
0 голосов
/ 07 марта 2019

Я использую следующую конфигурацию Powershell DSC для отключения визуальных эффектов.

Configuration OSConfig 
{
    param
    (
        [parameter()]
        [string]
        $NodeName = 'localhost'
    )

    # It is best practice to always directly import resources, even if the resource is a built-in resource.
    Import-DscResource -Name Service
    Import-DSCResource -Name WindowsClient
    Import-DscResource -Name Registry
    Import-DscResource -Name WindowsFeature
    Import-DscResource -Name WindowsOptionalFeature

    Node $NodeName
    {
        # The name of this resource block, can be anything you choose, as long as it is of type [String] as indicated by the schema.
        Registry VisualEffects
        {
        Ensure = "Present"

        Key = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects"

        ValueName = "VisualFXSetting"

        ValueData = "2"

        ValueType = "Dword"

        }
    }

  }

После запуска команды Start-DSCConfiguration я вижу, что значение visualfxsetting обновилось до 2. Но в графическом интерфейсе (в разделе Дополнительные свойства системы -> Визуальные эффекты) оно по-прежнему отображается как «пусть компьютер выберет то, что лучше для вас», и не «настраивать для лучшей производительности». Есть мысли об этом?

1 Ответ

1 голос
/ 07 марта 2019

После установки нового значения в реестре необходимо сообщить Windows Explorer, что что-то изменилось.

Перезагрузка компьютера сделает это, но вы можете попробовать просто перезапустить процесс проводника:

Stop-Process -ProcessName explorer

Другим подходом может быть использование Win32 API, например:

function Refresh-Explorer {
    $code = @'
private static readonly IntPtr HWND_BROADCAST = new IntPtr(0xffff);   //  http://www.pinvoke.net/default.aspx/Constants/HWND.html
private const uint WM_SETTINGCHANGE   = (uint)0x1a;                   //  http://www.pinvoke.net/default.aspx/Constants/WM.html
private const uint SMTO_ABORTIFHUNG   = (uint)0x0002;                 //  http://www.pinvoke.net/default.aspx/Enums/SendMessageTimeoutFlags.html
private const uint SHCNE_ASSOCCHANGED = (uint)0x08000000L;            //  http://www.pinvoke.net/default.aspx/Enums/SHChangeNotifyEventID.html
private const uint SHCNF_FLUSH        = (uint)0x1000;                 //  http://www.pinvoke.net/default.aspx/Enums/SHChangeNotifyFlags.html

[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SendMessageTimeout (IntPtr hWnd, uint Msg, IntPtr wParam, string lParam, uint fuFlags, uint uTimeout, IntPtr lpdwResult);

[System.Runtime.InteropServices.DllImport("Shell32.dll")]
private static extern int SHChangeNotify(uint eventId, uint flags, IntPtr item1, IntPtr item2);

public static void Refresh()  {
    SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH, IntPtr.Zero, IntPtr.Zero);
    SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, null, SMTO_ABORTIFHUNG, 100, IntPtr.Zero);
}
'@

    Add-Type -MemberDefinition $code -Namespace Win32Refresh -Name Explorer
    [Win32Refresh.Explorer]::Refresh()
}

# call the above function to tell explorer something has changed
Refresh-Explorer

Надеюсь, что поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...