如何更改windows注册表并立即生效

本文关键字:何更改 windows 注册表 | 更新日期: 2023-09-27 18:09:54

我想做一个可以改变注册表值的应用程序。我可以很好地改变注册表值,但问题是需要重新启动才能获得效果。我想在不重启的情况下完成它。

我想改变操作系统注册表值如壁纸和其他。

如何更改windows注册表并立即生效

注册表更改已经立即生效,然而许多应用程序(和一些操作系统组件)在第一次启动时只读取一次注册表设置,因此注册表更改将不会有任何影响,直到应用程序/机器重新启动。

如果你负责维护一个使用注册表设置的应用程序,并且你希望你的应用程序立即响应注册表更改而不需要重新启动,那么你可以使用WMI来接收注册表修改时的通知。参见注册表监视程序c#

如果你正在尝试更新另一个应用程序(或操作系统组件)的注册表项,并希望更改立即生效,那么这取决于特定的应用程序-请注意,除非该应用程序已经支持这一点,否则你可能无法完成整个加载,或者你可以说服应用程序维护者为你修改应用程序。


Update:如果您试图更新操作系统设置,如墙纸,那么通常注册表是错误的地方看!除了你目前面临的问题,你可能会发现注册表项在未来的Windows版本中会改变,这会破坏你的应用程序。

相反,你应该使用定义的Windows api来做这些事情,例如SystemParametersInfo函数可以用来更新墙纸,参见c#中的墙纸:

设置墙纸可以使用SystemParametersInfo来编程设置墙纸图片。这只适用于位图,所以当你想设置其他图像格式时,你必须首先将其转换为位图图像。

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern Int32 SystemParametersInfo(UInt32 uiAction, UInt32 uiParam, String pvParam, UInt32 fWinIni);
private static UInt32 SPI_SETDESKWALLPAPER = 20;
private static UInt32 SPIF_UPDATEINIFILE = 0x1;
private String imageFileName = "c:''sample.bmp";
public void SetImage( string filename )
{
    SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, filename, SPIF_UPDATEINIFILE);
}

注册表更改将立即生效,除非您的应用程序缓存了该设置。在本例中,您有2个选项:

  1. 每次想要使用它时从注册表中读取值,或者
  2. 订阅接收注册表更改通知。关于SO的讨论很好。

我想这取决于效果。注册表值会立即更改,但是重新启动会强制所有程序重新加载它们的注册表值。

关闭并重新启动所有在启动时读取注册表项的应用程序/服务。如果一个应用程序/任何东西在启动时读取了一个键,然后再也没有读取,(像大多数人一样),我看不到任何其他方式来传播你的更改。

准备好迎接大量的UAC弹出窗口…

祝好,马丁

启动任务管理器,在processes选项卡中选择资源管理器并结束该任务(如右下角所示)。然后从文件选项卡中选择新任务选项,并键入资源管理器.....祝你玩得愉快

就像许多人回答的那样,有些应用程序只会读取一次特定的注册表项,所以更改它直到该应用程序重新启动才会生效。但是,许多windows注册表设置可以通过广播设置更改通知来应用其效果。

希望这能对其他来到这个主题的人有所帮助。

[DllImport("user32.DLL")]
public static extern bool SendNotifyMessageA(IntPtr hWnd, uint Msg, int wParam, int lParam);
    
public static IntPtr HWND_BROADCAST = (IntPtr)0xffff;
public static uint WM_SETTINGCHANGE = 0x001A;
    
private static void ApplyRegistryChanges()
{
      SendNotifyMessageA(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
}