Как изменить глобальный прокси-сервер Windows с помощью C # .NET с «Немедленным эффектом» - PullRequest
17 голосов
/ 07 января 2010

Я пишу приложение Winform (C # .NET) для изменения глобальных настроек прокси-сервера Windows (или Internet Explorer).

Я использую это.

RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
registry.SetValue("ProxyEnable", 1);
registry.SetValue("ProxyServer", "127.0.0.1:8080");

Но это ведет себя странным образом. Я проверил это с помощью двух браузеров

  • Google Chrome:

Когда я меняю / отключаю прокси во время работы Chrome. Chrome все еще использует предыдущий прокси. Изменение не влияет на его процесс. Но когда я просто открываю Internet Options(inetcpl.cpl) > Connections > LAN Settings. Предыдущая смена прокси сейчас рассматривается. Когда я сказал Просто откройте Я действительно имел в виду Просто откройте . Я имею в виду, не редактируя и не нажимая какие-либо другие кнопки. Я полагаю, что тогда глобальный прокси-сервер действительно изменяется (при чтении из реестра), и Google Chrome немедленно начинает действовать.

  • Internet Explorer 8:

Случай с Internet Explorer намного хуже. После изменения / отключения прокси-сервера с помощью моего приложения во время работы IE и даже после перехода в «Свойства обозревателя (inetcpl.cpl)> Соединения> Настройки Lan» на работающий прокси IE это не влияет. Даже если я открою новую ссылку в новой вкладке. Мне пришлось перезапустить IE, чтобы это изменение было включено.

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

Как мне этого добиться?

1 Ответ

21 голосов
/ 08 января 2010

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

Как мне этого добиться?

Для этого вам нужно обновить систему.

Добавьте эти строки в начале вашего кода:

using System.Runtime.InteropServices;
using Microsoft.Win32;

Добавьте это в начале вашего класса:

[DllImport("wininet.dll")]
public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);
public const int INTERNET_OPTION_SETTINGS_CHANGED = 39;
public const int INTERNET_OPTION_REFRESH = 37;
static bool settingsReturn, refreshReturn;

И подразумевать код:

RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
registry.SetValue("ProxyEnable", 1);
registry.SetValue("ProxyServer", YOURPROXY);

// These lines implement the Interface in the beginning of program 
// They cause the OS to refresh the settings, causing IP to realy update
settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...