2008-10-13 7 views
29

estoy escribiendo una aplicación de Windows Forms que necesita para establecer la configuración del proxy de Internet Explorer y abra una nueva ventana del navegador. Por el momento, estoy aplicando la configuración de proxy por entrar en el registro:programación Conjunto de navegador Configuración de proxy en C#

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

va en el registro de la forma mejor de hacer esto, o hay un enfoque más recomendado? Me gustaría evitar cambios en el registro si hay una solución alternativa.

Respuesta

21

Esto depende de alguna manera de sus necesidades exactas. Si está escribiendo una aplicación C# y simplemente quiere establecer la configuración predeterminada del proxy que usará su aplicación, use la clase System.Net.GlobalProxySelection (http://msdn.microsoft.com/en-us/library/system.net.globalproxyselection.aspx). También puede establecer el proxy para cualquier conexión en particular con System.Net.WebProxy (http://msdn.microsoft.com/en-us/library/system.net.webproxy.aspx).

Si realmente desea actualizar la configuración del proxy en el registro, creo que deberá usar P/Invoke para llamar a la función WinAPtt WinSetDefaultProxyConfiguration (http://msdn.microsoft.com/en-us/library/aa384113.aspx).

+4

1.> Si realmente desea actualizar la configuración del proxy 'en el registro' < Si necesitamos cambiar las entradas de registro, ¿por qué necesitamos WinAPI? Podemos hacerlo usando C# como en la pregunta. – claws

+7

Por lo que puedo decir, la configuración del proxy WinHTTP que 'WinHttpSetDefaultProxyConfiguration' establece ** no ** es la misma que la configuración de Internet Explorer. ¿Alguna de las 13 personas que votaron en aumento en realidad * lo intentaron? –

6

Echa un vistazo a este artículo de KB específicamente etiquetado en lo que estás tratando de hacer.

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

La versión corta es que desea utilizar el InternetOpen, InternetSetOption API para actualizar la configuración del proxy.

+0

La pregunta era cómo hacer esto en C#. El artículo de KB no está en C#. –

+0

@MarkGood ¿A quién le importa? No todas las API se han vuelto a implementar en .NET. Es por eso que PInvoke existe. –

+0

@JaredPar el enlace que compartió ya no existe en support.microsoft.com –

15

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

Añadir estas líneas al comienzo de su código:

using System.Runtime.InteropServices; usando 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; 

e implican el código:

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

ejemplo Código rápido (de MSDN):

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

Esto no cambia la configuración proxy de IE/WinINET. – EricLaw

6

me escribió un programa de 10 líneas para hacer eso, no dude en probar 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); 
     } 
    } 
} 
+0

Su código no funciona, ya que un número 0 o 1 debe establecerse en ProxyEnable. Estás configurando una cadena y esto no está funcionando. Lo estoy arreglando – ehh

+0

Mi servidor proxy se establece automáticamente por la política de grupo o algo así. Cuando lo cambio usando tu camino simplemente ejecutando la aplicación funciona bien. Cuando trato de hacer lo mismo desde el servicio de Windows, el valor de registro se establece, pero inmediatamente revierte al valor predeterminado de la política cuando realizo cualquiera de estas llamadas 'InternetSetOption'. Si no llamo a InternetSetOption', el valor de registro cambia, pero no el proxy activo real. No tengo idea de por qué. – rook

+0

Sí, puede confirmar que Registry.SetValue (keyName, "ProxyEnable", proxyEnabled? "1": "0"); no funcionará, pero Registry.SetValue (keyName, "ProxyEnable", proxyEnabled? 1: 0); funciona bien. (Los valores deben pasar no como cadenas) – Vital

Cuestiones relacionadas