2010-01-07 16 views
15

Tôi đang viết ứng dụng của Winform (C# .NET) để thay đổi cài đặt proxy toàn cầu của Windows (aka Internet Explorer).Cách thay đổi Proxy Windows toàn cầu bằng cách sử dụng C# .NET với `Hiệu ứng ngay lập tức '

Tôi đang sử dụng tính năng này.

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

Nhưng hoạt động của nó theo cách lạ thường. Tôi đã thử nghiệm này sử dụng hai trình duyệt

  • Google Chrome:

Khi tôi thay đổi/Disable proxy khi Chrome đang chạy. Chrome vẫn đang sử dụng proxy trước đó. Sự thay đổi không ảnh hưởng đến quá trình của nó. Nhưng khi tôi CHỈ, hãy mởInternet Options(inetcpl.cpl) > Connections > LAN Settings. Thay đổi proxy trước đó hiện được xem xét. Khi tôi nói Chỉ cần mở Tôi thực sự có nghĩa là Chỉ cần mở. Ý tôi là, không chỉnh sửa hoặc nhấp vào bất kỳ nút nào khác. Tôi đoán, sau đó proxy toàn cầu là thực sự bị thay đổi (bằng cách đọc từ sổ đăng ký) & Google Chrome ngay lập tức có hiệu lực.

  • Internet Explorer 8:

Case với trình duyệt Internet Explorer là tồi tệ hơn nhiều. Sau khi thay đổi/vô hiệu hóa proxy bằng ứng dụng của tôi trong khi IE đang chạy & Ngay cả sau khi chuyển đến "Tùy chọn Internet (inetcpl.cpl)> Kết nối> Cài đặt Lan" Proxy IE đang chạy không bị ảnh hưởng. Ngay cả khi tôi mở một liên kết mới trong một tab mới. Tôi phải khởi động lại IE để thay đổi đó được kết hợp.

Hành vi tôi muốn là bất cứ khi nào tôi thay đổi cài đặt proxy trong ứng dụng, tất cả các trình duyệt đang sử dụng proxy toàn cầu (bất kể họ đang chạy hay không) phải ngay lập tức kết hợp thay đổi trong cài đặt.

Tôi làm cách nào để đạt được điều này?

+0

xem trang này. http://stackoverflow.com/questions/5216323/setting-ie-proxy-by-c-sharp –

Trả lời

20

Các hành vi tôi muốn là khi từng tôi thay đổi cài đặt proxy trong ứng dụng của tôi, tất cả các trình duyệt đang sử dụng toàn cầu proxy (bất kể họ đang chạy hay không) nên ngay lập tức kết hợp thay đổi trong cài đặt.

Tôi làm cách nào để đạt được điều này?

Bạn cần làm mới hệ thống để đạt được điều đó.

Thêm những dòng này ở đầu mã của bạn:

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

Thêm này vào đầu lớp học của bạn:

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

Và bao hàm mã:

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

Gọi mã này để đặt proxy hoạt động, nhưng cuộc gọi tiếp theo để đặt lại các giá trị trước đó (mà tôi đã kéo và lưu trữ từ sổ đăng ký) từ cùng một chương trình không có hiệu lực. Bất kỳ ý tưởng? –

+2

Cảm ơn. Tôi sử dụng mã này trong win8, nó là ok cho ví dụ. nhưng không đặt proxy trong win7 !!! – Niloo

+1

@claws Mã hoạt động tốt. nhưng làm thế nào để viết thông tin đăng nhập? "tên người dùng" và "mật khẩu"? –

Các vấn đề liên quan