2011-09-27 125 views
0

我想做一个应用程序,可以更改注册表值。我可以很好地更改注册表值,但问题是需要重新启动才能获得它的效果。我想不重启就做。C#:如何更改Windows注册表,并立即生效

我想要更改OS注册表值像壁纸和其他人。

+3

你需要重新启动什么?您的应用程序,其他应用程序或操作系统? – ChrisF

回答

0

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

  1. 你想用它每次从注册表中读取值,或
  2. 订阅接收的注册表更改通知。有一个很好的discussion on SO
0

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

0

关闭并重新启动所有读取注册表项的应用程序/服务。如果一个应用程序/无论在启动时读取一个密钥,也不会再一次(像大多数应用程序一样),我看不到任何其他传播变化的方式。

准备好了很多UAC弹出窗口的...

RGDS, 马丁

5

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

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

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


更新:如果您正试图更新,如壁纸OS设置,然后通常注册表错误的地方看看!除了当前面临的问题,您可能会发现在将来的Windows版本中,注册表项会发生变化,从而破坏了您的应用程序。

相反,你应该使用定义的Windows API做这些事情,例如SystemParametersInfo function可以用来更新壁纸,看到Wallpaper in c#

有关设置,您可以使用SystemParametersInfo设置壁纸一个壁纸图像编程。这适用于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); 
} 
+0

非常感谢Registry Watcher Link。 – BigMike

0

刚开始的任务管理器和进程选项卡中选择资源管理器,结束这项任务(在右上角显示)。然后上去并从文件选项卡中选择新的任务选项,并键入资源管理器.....塔塔在这里你很享受。