我想通过 regedit 更改 toast 通知显示时间。
MessageDuration
这可以通过更改此注册表项下的值来完成:
HKEY_CURRENT_USER\Control Panel\Accessibility
如果我通过控制面板更改此设置,新设置将立即应用。
但是,如果通过 regedit 更改此设置,除非我重新启动 Windows,否则不会应用新设置。
我怎样才能在不重启的情况下做到这一点?
答案1
许多控制面板自定义设置旨在通过SystemParametersInfo
Win32 函数。要更改通知消息持续时间,可以使用操作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_UPDATEINIFILE
和SPIF_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
并单击“确定” - 桌面将重新出现。