90213


使用中の環境はWindows10です。  
設定 > 簡単操作 > オーディオ > 「オーディオの警告を視覚的に表示する」（[Windows
を聞きやすくする](https://support.microsoft.com/ja-
jp/windows/windows-%E3%82%92%E8%81%9E%E3%81%8D%E3%82%84%E3%81%99%E3%81%8F%E3%81%99%E3%82%8B-9c18cfdc-63be-2d47-0f4f-5b00facfd2e1#bkmk_visualalerts&WindowsVersion=Windows_10)）  
の変更をPowershellから実行しようとしています。

変更は以下のレジストリに記録されることはわかっています。

[code]

    [HKEY_USERS\S-1-5-21-2877195124-415269717-4107617414-1001\Control Panel\Accessibility\SoundSentry]
    "WindowsEffect"="0～3"
    
[/code]

  * 設定で変更すれば値はすぐに反映されレジストリに書き込まれます。
  * しかし、レジストリを直接変更しても設定は反映されません。
  * 再起動するとレジストリは再読み込みされ値が反映されます。

このような場合、「SendMessageTimeout」などの関数で更新を反映すると思われます。  
具体的な反映方法がわかる方はおりませんでしょうか。

以下はレジストリを変更するPowershellのスクリプトです。

[code]

    New-PSDrive -Name HKU -PSProvider Registry -Root HKEY_USERS
    $RegPath = "HKU:\S-1-5-21-2877195124-415269717-4107617414-1001\Control Panel\Accessibility\SoundSentry"
    $RegKey = "WindowsEffect"
    $CurrentRegKeyValue = (Get-ItemProperty -Path $RegPath -Name $RegKey).WindowsEffect
    $RegKeyValue = "3"
    Set-ItemProperty $RegPath -name $RegKey -Value $RegKeyValue
    
[/code]


CC BY-SA 4.0
2022-07-26T07:29:42.427
90201
2022-07-27T00:26:31.310
42735
question
windows powershell
「オーディオの警告を視覚的に表示する」の変更をPowershellから実行したい


レジストリ更新では即座に反映されません。User32.dllの[SystemParametersInfo](https://docs.microsoft.com/en-
us/windows/win32/api/winuser/nf-winuser-
systemparametersinfoa)を使うことで即座に反映されるようになります。

実際に設定する方法について[SOUNDSENTRYW structure](https://docs.microsoft.com/en-
us/windows/win32/api/winuser/ns-winuser-soundsentryw)を参考にしてください。

サンプル

[code]

    # C#コードのインポート
    Add-Type @"
    using System;
    using System.Runtime.InteropServices;
    
    public static class NativeMethods
    {
        public static void Execute()
        {
            var soundSentry = new SOUNDSENTRYW();
            uint size = (uint)Marshal.SizeOf(typeof(SOUNDSENTRYW));
            soundSentry.cbSize = size;
            var result = NativeMethods.SystemParametersInfo(SPI_GETSOUNDSENTRY, size, ref soundSentry, 0);
            if (result)
            {
                soundSentry.iWindowsEffect = 3;
                result = NativeMethods.SystemParametersInfo(SPI_SETSOUNDSENTRY, size, ref soundSentry, SPIF_UPDATEINIFILE);
            }
        }
        const uint SPI_GETSOUNDSENTRY = 0x0040;
        const uint SPI_SETSOUNDSENTRY = 0x0041;
        const uint SPIF_UPDATEINIFILE = 0x01;
        
        internal struct SOUNDSENTRYW
        {
           public uint cbSize;
            public uint dwFlags;
            public uint iFSTextEffect;
            public uint iFSTextEffectMSec;
            public uint iFSTextEffectColorBits;
            public uint iFSGrafEffect;
            public uint iFSGrafEffectMSec;
            public uint iFSGrafEffectColor;
            public uint iWindowsEffect;
            public uint iWindowsEffectMSec;
            [MarshalAs(UnmanagedType.LPWStr)]
            public string lpszWindowsEffectDLL;
            public uint iWindowsEffectOrdinal;
        }
    
        [DllImport("User32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern bool SystemParametersInfo(
            uint uiAction,
            uint uiParam,
            ref SOUNDSENTRYW pvParam,
            uint fWinIni
            );
    }
    "@
    
    # C#コードの呼び出し。
    [NativeMethods]::Execute()
    
[/code]


CC BY-SA 4.0
2022-07-26T15:04:58.500
90213
2022-07-27T00:26:31.310
2022-07-27T00:26:31.310
14890
14890
90201
answer