C#:如何更改Windows注册表并立即生效

时间:2011-09-27 10:05:24

标签: c# .net c#-4.0 registry

我正在尝试创建一个可以更改注册表值的应用程序。我可以很好地更改注册表值,但问题是需要重新启动才能使其生效。我想在不重启的情况下这样做。

我希望更改操作系统注册表值,如壁纸等。

6 个答案:

答案 0 :(得分:5)

注册表更改已立即生效,但许多应用程序(和某些操作系统组件)在首次启动时只读取注册表设置一次,因此在重新启动应用程序/计算机之前,注册表更改不会产生任何影响。

如果您负责维护使用注册表设置的应用程序,并且您希望应用程序立即响应注册表更改而无需重新启动,则可以在修改注册表时使用WMI来接收通知。见Registry Watcher C#

如果您尝试更新另一个应用程序(或操作系统组件)的注册表项并希望更改立即生效,那么这取决于特定的应用程序 - 请注意,可能没有完整的负载除非该应用程序已经支持此功能,否则您可以这样做,或者您可以说服应用程序维护人员为您修改应用程序。


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

相反,您应该使用定义的Windows API来执行这些操作,例如SystemParametersInfo function可用于更新壁纸,请参阅Wallpaper in c#

  

要设置壁纸,您可以使用SystemParametersInfo以编程方式设置壁纸图像。这仅适用于Bitmap,因此当您想要设置其他图像格式时,必须先将其转换为Bitmap图像。

[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);
}

答案 1 :(得分:1)

除非您的应用程序缓存了该设置,否则注册表更改将立即生效。在这种情况下,您有两个选项:

  1. 每次要使用时都从注册表中读取值,或
  2. 订阅以接收注册表更改的通知。有一个很好的discussion on SO

答案 2 :(得分:0)

我认为这取决于效果。注册表值立即更改,但重新启动会强制所有程序重新加载其注册表值。

答案 3 :(得分:0)

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

为很多UAC弹出窗口做好准备...

RGDS, 马丁

答案 4 :(得分:0)

启动任务管理器并在进程选项卡中选择资源管理器并结束该任务(如右下角所示)。然后上去从文件选项卡中选择新任务选项并输入explorer ..... tasa在这里你很享受。

答案 5 :(得分:0)

就像很多人回答的那样,有些应用程序只会读取一次特定的注册表项,因此在该应用程序重新启动之前更改它不会生效。但是,许多 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);
}