C #: Как изменить реестр Windows и вступить в силу немедленно - PullRequest
0 голосов
/ 27 сентября 2011

Я пытаюсь создать приложение, которое может изменять значения реестра.Я могу изменить значения в реестре, но проблема в том, что нужно перезапустить, чтобы получить эффект.Я хочу сделать это без перезагрузки.

Я хочу изменить значение реестра ОС, например, в качестве обоев и других.

Ответы [ 5 ]

6 голосов
/ 27 сентября 2011

Изменения в реестре вступают в силу немедленно, однако многие приложения (и некоторые компоненты операционной системы) читают параметры реестра только при первом запуске, поэтому изменения в реестре не будут иметь никакого эффекта, пока приложение / компьютер не будет перезапущен.

Если вы несете ответственность за обслуживание приложения, использующего параметры реестра, и хотите, чтобы ваше приложение незамедлительно реагировало на изменения реестра без необходимости перезапуска, вы можете использовать WMI для получения уведомлений при изменении реестра. См. Registry Watcher C #

Если вы пытаетесь обновить раздел реестра для другого приложения (или компонента операционной системы) и хотите, чтобы изменения вступили в силу немедленно, это относится к конкретному приложению - имейте в виду, что, вероятно, не вся нагрузка, которая вы можете сделать это, если это уже не поддерживается этим приложением, или вы можете убедить разработчиков приложения изменить приложение для вас.


Обновление: Если вы пытаетесь обновить настройки ОС, такие как обои, то реестр обычно не туда подходит! Помимо проблем, с которыми вы сейчас сталкиваетесь, вы, вероятно, обнаружите, что разделы реестра изменятся в будущих версиях Windows, что приведет к поломке вашего приложения.

Вместо этого вы должны использовать определенные API-интерфейсы Windows для выполнения подобных операций, например, Функция 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 голосов
/ 27 сентября 2011

Изменения в реестре вступят в силу немедленно, если ваше приложение не кэширует настройки.В этом случае у вас есть 2 варианта:

  1. Считывать значение из реестра каждый раз, когда вы хотите его использовать, или
  2. Подписаться, чтобы получать уведомления об изменениях реестра.Есть хорошая дискуссия по SO .
1 голос
/ 27 сентября 2011

Завершите работу и перезапустите все приложения / службы, которые читают ваш раздел реестра при запуске. Если приложение / что-либо читает ключ при запуске и никогда больше (как большинство из них), я не вижу другого способа распространения вашего изменения.

Приготовьтесь ко множеству всплывающих окон UAC ...

Rgds, Martin

1 голос
/ 27 сентября 2011

Полагаю, это зависит от эффекта. Значение реестра немедленно изменяется, но перезагрузка заставляет все программы перезагружать их значения реестра.

0 голосов
/ 13 августа 2017

Просто запустите диспетчер задач и на вкладке процессов выберите проводник и завершите эту задачу (показано в правом углу). Затем перейдите наверх и выберите новую опцию задачи на вкладке файла и введите explorer ..... tasa здесь вам понравится.

...