36

我正在编写一个 winforms 应用程序,它需要设置 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");

进入注册表是最好的方法,还是有更推荐的方法?如果有替代解决方案,我想避免更改注册表。

4

6 回答 6

21

这在某种程度上取决于您的确切需求。如果您正在编写 C# 应用程序并且只想设置您的应用程序将使用的默认代理设置,请使用类 System.Net.GlobalProxySelection ( http://msdn.microsoft.com/en-us/library/system.net .globalproxyselection.aspx)。您还可以使用 System.Net.WebProxy ( http://msdn.microsoft.com/en-us/library/system.net.webproxy.aspx ) 为任何特定连接设置代理。

如果您真的想更新注册表中的代理设置,我相信您需要使用 P/Invoke 来调用 WinAPI 函数 WinHttpSetDefaultProxyConfiguration ( http://msdn.microsoft.com/en-us/library/aa384113. .aspx)。

于 2008-10-16T15:34:34.427 回答
21

来自:http ://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/19517edf-8348-438a-a3da-5fbe7a46b61a

在代码的开头添加这些行:

使用 System.Runtime.InteropServices;使用 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;
    bool settingsReturn, refreshReturn;

并暗示代码:

        RegKey.SetValue("ProxyServer", YOURPROXY);
        RegKey.SetValue("ProxyEnable", 1);

        // 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);
于 2010-12-20T20:20:52.607 回答
14

我写了一个 10 行的程序来做到这一点,请随意尝试https://github.com/131/proxytoggle

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using Microsoft.Win32;

namespace ProxyToggle
{

    class Program
    {

        [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 void setProxy(string proxyhost, bool proxyEnabled)
        {
            const string userRoot = "HKEY_CURRENT_USER";
            const string subkey = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
            const string keyName = userRoot + "\\" + subkey;

            Registry.SetValue(keyName, "ProxyServer", proxyhost);
            Registry.SetValue(keyName, "ProxyEnable", proxyEnabled?"1": "0");

            // These lines implement the Interface in the beginning of program 
            // They cause the OS to refresh the settings, causing IP to realy update
            InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
            InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
        }

        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                setProxy("", false);
                return;
            }

            setProxy(args[0], true);
        }
    }
}
于 2014-10-09T07:52:33.010 回答
6

查看这篇专门标记为您正在尝试做什么的知识库文章。

http://support.microsoft.com/kb/226473

简短的版本是您想使用 InternetOpen、InternetSetOption API 来更新代理设置。

于 2008-10-13T15:27:06.940 回答
3

您可以使用自 FW 2.0 以来存在的这种有用的方法:(我刚刚发现,我现在是另一个人......)

http://msdn.microsoft.com/en-us/library/system.net.webrequest.getsystemwebproxy.aspx

于 2012-10-22T09:17:46.490 回答
-2

快速代码示例(来自 msdn):

WebProxy proxyObject = new WebProxy("http://proxyserver:80/",true);
WebRequest req = WebRequest.Create("http://www.contoso.com");
req.Proxy = proxyObject;
于 2012-01-04T08:50:06.410 回答