我正在尝试创建一个可以更改注册表值的应用程序。我可以很好地更改注册表值,但问题是需要重新启动才能使其生效。我想在不重启的情况下这样做。
我希望更改操作系统注册表值,如壁纸等。
答案 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)
除非您的应用程序缓存了该设置,否则注册表更改将立即生效。在这种情况下,您有两个选项:
答案 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);
}