2010-01-07 21 views
15

Estoy escribiendo una aplicación de Winform (C# .NET) para cambiar la configuración del proxy global de Windows (también conocido como Internet Explorer).Cómo cambiar el Proxy global de Windows usando C# .NET con 'Efecto inmediato'

Estoy usando esto.

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

Pero se comporta de una manera extraña. Probé esto utilizando dos navegadores

  • Google Chrome:

Cuando cambio/desactivar el proxy mientras que Chrome se está ejecutando. Chrome aún usa el proxy anterior. El cambio no está afectando su proceso. Pero cuando yo SOLO abreInternet Options(inetcpl.cpl) > Connections > LAN Settings. El cambio de proxy anterior ahora se considera. Cuando dije Acabo de abrir Realmente quiero decir Solo abra. Es decir, no edito ni hago clic en ningún otro botón. Supongo que es el proxy global el que está cambiando realmente (leyendo del registro) & Google Chrome está tomando el efecto de inmediato.

  • Internet Explorer 8:

Caso con Internet Explorer es mucho peor. Después de cambiar/deshabilitar el proxy utilizando mi aplicación mientras se ejecuta IE & Incluso después de ir a "Opciones de Internet (inetcpl.cpl)> Conexiones> Configuración de LAN" El proxy IE en ejecución no se ve afectado. Ni siquiera si abro un nuevo enlace en una nueva pestaña. Tuve que reiniciar IE para que se incorporara ese cambio.

El comportamiento que quiero es que cada vez que cambio la configuración del proxy en mi aplicación, todos los navegadores que se utiliza Proxy mundial (con independencia de si están funcionando o no) deben instante incorporar el cambio en la configuración.

¿Cómo puedo lograrlo?

+0

vistazo a esta página. http://stackoverflow.com/questions/5216323/setting-ie-proxy-by-c-sharp –

Respuesta

20

El comportamiento que quiero es que cuando cada vez puedo cambiar la configuración de proxy en mi aplicación, todos los los navegadores que están utilizando de proxy mundial (con independencia de que se están ejecutando o no) debe instantáneamente incorporar el cambio en la configuración.

¿Cómo puedo lograrlo?

Necesita actualizar su sistema para lograr eso.

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

using System.Runtime.InteropServices; 
using Microsoft.Win32; 

Añadir esto en el comienzo de su clase:

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

e implican el código:

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

Llamar a este código para configurar el proxy funciona, pero una llamada posterior para restablecer los valores anteriores (que sacó y almacenó del registro) desde el mismo programa no tiene ningún efecto. ¿Algunas ideas? –

+2

Gracias. Uso este código en win8, está bien para decir. ¡pero no configure el proxy en win7! – Niloo

+1

@claws El código funciona bien. pero, ¿cómo escribir las credenciales? "usuario Contraseña" ? –

Cuestiones relacionadas