如何使用C# .NET更改全局Windows代理,实现“即时生效”

20

我正在编写一个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的情况要糟糕得多。在我的应用程序中更改/禁用代理后,即使在“Internet Options(inetcpl.cpl)> Connections > Lan Settings”中操作后,正在运行的IE代理也没有受到影响。即使我在新标签页中打开新链接也不行。我必须重新启动IE才能使更改生效。

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

我该如何实现这一点?


对于IE浏览器:https://dev59.com/13VC5IYBdhLWcg3wvT1a - A G
请查看以下页面。http://stackoverflow.com/questions/5216323/setting-ie-proxy-by-c-sharp - Ebrahim Rad
1个回答

26

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

我该如何实现这一点?

要实现这一点,您需要刷新系统。

请在代码开头添加以下几行:

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

调用此代码设置代理是有效的,但从同一程序中调用以重置之前从注册表中提取和存储的值没有效果。有什么想法吗? - Petrus Theron
1
@claws 代码运行良好。但是如何编写凭据?“用户名”和“密码”? - Dark_Knight
1
这段代码相当不错...但它肯定不能在Windows 10上运行。它无法更新UI中的代理设置,而且代理本身在此之后也无法工作。 - Nikas Žalias
2
@NikasŽalias 我刚刚使用了上面的代码,在Windows 10上运行良好。 - Jeremy Su

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接