如何通过 Regedit 更改“控制面板”设置而无需重新启动?

如何通过 Regedit 更改“控制面板”设置而无需重新启动?

我想通过 regedit 更改 toast 通知显示时间。

MessageDuration这可以通过更改此注册表项下的值来完成:

HKEY_CURRENT_USER\Control Panel\Accessibility

如果我通过控制面板更改此设置,新设置将立即应用。

但是,如果通过 regedit 更改此设置,除非我重新启动 Windows,否则不会应用新设置。

我怎样才能在不重启的情况下做到这一点?

答案1

许多控制面板自定义设置旨在通过SystemParametersInfoWin32 函数。要更改通知消息持续时间,可以使用操作SPI_SETMESSAGEDURATION(0x2017) 调用该函数。以下是 PowerShell 脚本,它接受一个参数,该参数指定所需的消息持续时间(以秒为单位)并应用设置更改:

Param(
    [int]$MessageDuration
)

Add-Type @"
using System.Runtime.InteropServices;
public class PInvoke {
    [DllImport("user32.dll")] public static extern int SystemParametersInfo(int uiAction, int uiParam, System.IntPtr pvParam, int fWinIni);
}
"@

[PInvoke]::SystemParametersInfo(0x2017, 0, [IntPtr]$MessageDuration, 3)

最后一个参数中的 3 设置SPIF_UPDATEINIFILESPIF_SENDCHANGE标志,以便将新值写入注册表,并且所有应用程序都会收到设置更改通知。如果函数成功,则返回 1。

要使用该脚本,请将其保存为 PS1 文件,例如toasttime.ps1。然后您可以从命令提示符中调用它,如下所示:

powershell -executionpolicy bypass -c .\toasttime.ps1 60

或者,如果您只是想通过其他方式应用注册表中已设置的持续时间,则可以使用此脚本的变体,从注册表中读取所需的持续时间,而不是采用参数:

Add-Type @"
using System.Runtime.InteropServices;
public class PInvoke {
    [DllImport("user32.dll")] public static extern int SystemParametersInfo(int uiAction, int uiParam, System.IntPtr pvParam, int fWinIni);
}
"@

$accessibility = Get-ItemProperty 'HKCU:\Control Panel\Accessibility'
[PInvoke]::SystemParametersInfo(0x2017, 0, [IntPtr]$accessibility.MessageDuration, 3)

答案2

注销并登录就足够了。

或者您可以通过以下方式重新启动 Explorer:

  • 启动任务管理器
  • 右键explorer.exe选择“结束任务”,桌面就会消失
  • 使用菜单文件 > 运行新任务
  • 输入explorer并单击“确定”
  • 桌面将重新出现。

相关内容