Программная установка параметров прокси-сервера браузера в C#

Я пишу приложение 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");

Идет ли это в реестр способом Лучший, или есть более рекомендуемый подход? Я бы хотел избежать изменений в реестре, если есть альтернативное решение.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
35
0
68 000
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ознакомьтесь с этой статьей базы знаний, специально посвященной тому, что вы пытаетесь сделать.

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

Вкратце, вы хотите использовать InternetOpen, InternetSetOption API для обновления настроек прокси.

Вопрос был в том, как это сделать на C#. Статья базы знаний не написана на C#.

Mark Good 26.03.2011 16:46

@MarkGood Какая разница? Не все API были повторно реализованы в .NET. Вот почему существует PInvoke.

Jonathon Reinhart 31.07.2013 23:14

@JaredPar ссылка, которой вы поделились, больше не существует на support.microsoft.com

Charan Ghate 08.03.2018 16:40
Ответ принят как подходящий

Это отчасти зависит от ваших конкретных потребностей. Если вы пишете приложение 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).

1.> Если вы действительно хотите обновить настройки прокси in the registry <Если нам нужно изменить записи реестра, зачем нам WinAPI? Мы можем сделать это с помощью C#, как в вопросе.

claws 07.01.2010 11:42

Насколько я могу судить, настройки прокси-сервера WinHTTP, которые устанавливает WinHttpSetDefaultProxyConfiguration, - это нет, такие же, как настройки Internet Explorer. Кто-нибудь из 13 человек, проголосовавших за это, на самом деле это пытаться?

Jonathon Reinhart 01.08.2013 02:23

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

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

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

Пример быстрого кода (из msdn):

WebProxy proxyObject = new WebProxy("http://proxyserver:80/",true);
WebRequest req = WebRequest.Create("http://www.contoso.com");
req.Proxy = proxyObject;

Это не меняет настройки прокси IE / WinINET.

EricLaw 09.10.2013 01:43

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

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

Для этого я написал программу из 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);
        }
    }
}

Ваш код не работает, поскольку для ProxyEnable должно быть установлено число 0 или 1. Вы устанавливаете строку, и это не работает. Я исправляю это

ehh 15.03.2017 13:14

Мой прокси-сервер автоматически настраивается групповой политикой или чем-то еще. Когда я меняю его, используя ваш способ, просто выполняя приложение, оно работает нормально. Когда я пытаюсь сделать то же самое, значение реестра службы Windows устанавливается, но сразу же возвращается к политике по умолчанию, когда я делаю любой из этих вызовов InternetSetOption. Если я не вызываю InternetSetOption` - изменяется значение реестра, но не фактический активный прокси. Понятия не имею, почему.

rook 13.04.2017 01:14

Да, могу подтвердить, что Registry.SetValue (keyName, "ProxyEnable", proxyEnabled? "1": "0"); не будет работать, но Registry.SetValue (keyName, "ProxyEnable", proxyEnabled? 1: 0); работает отлично. (Значения следует передавать не в виде строк)

Vital 06.05.2017 14:40

Другие вопросы по теме