Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to change Global Windows Proxy using C# .NET with `Immediate Effect`

Tags:

c#

.net

proxy

I'm writing a Winform's (C# .NET) app to change Windows' Global (aka Internet Explorer's) proxy settings.

I'm using this.

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

But its behaving in a weird manner. I tested this using two browsers

  • Google Chrome:

When I change/Disable the proxy while Chrome is running. Chrome is still using the previous proxy. The change is not effecting its process. But when I JUST open Internet Options(inetcpl.cpl) > Connections > LAN Settings. The previous change of proxy is now considered. When I said Just open I really mean Just open. I mean, not editing or clicking any other buttons. I guess, its then the global proxy is really getting changed (by reading from registry) & Google Chrome is immediately taking the effect.

  • Internet Explorer 8:

Case with Internet Explorer is much worse. After changing/disabling the proxy using my app while IE is running & Even after going to "Internet Options(inetcpl.cpl) > Connections > Lan Settings" The running IE proxy isn't getting affected. Not even if I open a new link in a new tab. I had to restart IE for that change to be incorporated.

The behavior I want is that whenever I change proxy settings in my app, all the browsers which are using global proxy (irrespective of whether they are running or not) should instantly incorporate the change in settings.

How can I achieve this?

like image 273
claws Avatar asked Jan 07 '10 12:01

claws


People also ask

Where is proxy settings in CMD?

Click Start, click Run, type cmd, and then click OK. At the command prompt, type netsh winhttp show proxy, and then press ENTER.

How do I manually set a proxy?

To set up a proxy server connection manuallySelect the Start button, then select Settings > Network & Internet > Proxy. Under Manual proxy setup, turn on Use a proxy server. Do the following: In the Address and Port boxes, enter the proxy server name or IP address and port (optional) in the respective boxes.


1 Answers

The behavior I want is that when ever I change proxy settings in my app, all the browsers which are using global proxy (irrespective of whether they are running or not) should instantly incorporate the change in settings.

How can I achieve this?

You need to refresh your system to achieve that.

Add these lines at the beginning of your code:

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

Add this in the beginning of your class:

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

And imply the code:

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);
like image 161
claws Avatar answered Sep 17 '22 14:09

claws