2010-01-07 9 views
15

Piszę aplikację WinForm (C# .NET), aby zmienić ustawienia proxy systemu Windows globalne (znane również jako Internet Explorer).Jak zmienić globalny serwer proxy systemu Windows przy użyciu języka C# .NET za pomocą funkcji "Immediate Effect"

Używam tego.

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

Ale zachowuje się w dziwny sposób. Testowałem to przy użyciu dwóch przeglądarek

  • Google Chrome:

Kiedy zmienić/wyłączyć proxy podczas Chrome jest uruchomiony. Chrome nadal używa poprzedniego serwera proxy. Zmiana nie wpływa na proces. Ale kiedy I JUST openInternet Options(inetcpl.cpl) > Connections > LAN Settings. Poprzednia zmiana proxy jest teraz rozważana. Kiedy powiedziałem: Po prostu otwórz Naprawdę mam na myśli Po prostu otwórz. Mam na myśli, nie edytując ani nie klikając żadnych innych przycisków. Domyślam się, że to globalny serwer proxy jest naprawdę się zmienia (czytając z rejestru) & Google Chrome od razu przynosi efekt.

  • Internet Explorer 8:

Case Internet Explorer jest znacznie gorzej. Po zmianie/wyłączeniu proxy przy użyciu mojej aplikacji, podczas gdy IE działa & Nawet po przejściu do "Opcje internetowe (inetcpl.cpl)> Połączenia> Ustawienia sieci LAN" Działający serwer proxy IE nie zostaje dotknięty. Nawet jeśli otworzę nowy link w nowej karcie. Musiałem zrestartować IE, aby ta zmiana została włączona.

Zachowanie chcę jest, że ilekroć zmienić ustawienia proxy w mojej aplikacji, wszystkie przeglądarki, które używają globalny serwer proxy (niezależnie od tego, czy są one uruchomione lub nie) powinny natychmiast zawierają zmiany w ustawieniach.

Jak mogę to osiągnąć?

+0

spojrzeć na ta strona. http://stackoverflow.com/questions/5216323/setting-ie-proxy-by-c-sharp –

Odpowiedz

20

Zachowanie chcę jest, że gdy kiedykolwiek zmienić ustawienia proxy w mojej aplikacji, wszystkie przeglądarek, które są przy użyciu globalnej proxy (niezależnie od tego, czy są uruchomione lub nie) powinien natychmiast włączyć zmianę ustawień.

Jak mogę to osiągnąć?

Musisz odświeżyć system, aby to osiągnąć.

Dodaj te linie na początku kodu:

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

Dodaj to na początku swojej klasie:

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

I oznaczać kod:

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

Wywołanie tego kodu, aby ustawić serwer proxy, działa, ale kolejne wywołanie, aby zresetować poprzednie wartości (które zostały wyciągnięte i zapisane w rejestrze) z tego samego programu, nie ma żadnego efektu. Jakieś pomysły? –

+2

Dzięki. Używam tego kodu w win8, jest ok dla np. ale nie ustawiaj proxy w win7! – Niloo

+1

@claws Kod działa dobrze. ale jak pisać referencje? "Nazwa użytkownika Hasło" ? –