如何使用带有“立即效果”的C#.NET更改全局Windows代理

我正在编写一个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"); 

但它表现得很奇怪。 我使用两个浏览器测试了这个

  • 谷歌浏览器:

在Chrome运行时更改/禁用代理时。 Chrome仍在使用之前的代理。 这一变化并未影响其进程。 但是当我打开 Internet Options(inetcpl.cpl) > Connections > LAN Settings 。 现在考虑先前的代理更改。 当我说刚刚打开时,我的意思是开启 。 我的意思是,不要编辑或点击任何其他按钮。 我猜,它的全局代理实际上正在改变(通过从注册表中读取)和谷歌Chrome立即起作用。

  • Internet Explorer 8:

Internet Explorer的情况要糟糕得多。 在IE运行时使用我的应用程序更改/禁用代理后甚至在转到“Internet选项(inetcpl.cpl)>连接> Lan设置”后,正在运行的IE代理不会受到影响。 即使我在新标签中打开新链接也不行。 我不得不重新启动IE以进行该更改。

我想要的行为是,每当我在我的应用程序中更改代理设置时,所有使用全局代理的浏览器(无论它们是否正在运行)都应立即将更改纳入设置中。

我怎样才能做到这一点?

我想要的行为是,当我在我的应用程序中更改代理设置时,所有使用全局代理的浏览器(无论它们是否正在运行)都应立即在设置中包含更改。

我怎样才能做到这一点?

您需要刷新系统才能实现这一目标。

在代码的开头添加以下行:

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

对于IE:

以编程方式在C#中设置浏览器代理设置