2010-01-13 60 views
4

我正在嘗試編寫一個基於網絡連接處於活動狀態的應用程序,該應用程序會自動更改代理服務器。在這個應用程序中,用戶也可以手動點擊notifyIcon上下文菜單中的服務器並調用該函數來切換服務器。爲什麼我第一次只能更改註冊表?

我的問題如下:第一次調用該函數時,應用程序會更改代理服務器,但在此之後將不起作用。我已經把調試語句,以確保正確的代理服務器正在傳遞給該函數(它確實是正確的),但註冊表項在第一次後永遠不會改變。我究竟做錯了什麼?

這裏是我的代理類:

class Proxy 
{ 
    [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; 

    public void SetProxy(ProxyList proxy) 
    { 
     RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); 
     registry.SetValue("ProxyEnable", 1); 
     registry.SetValue("ProxyServer", proxy.server + ":" + proxy.port); 
     registry.Close(); 

     // 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); 
    } 


} 

這裏是我如何調用從上下文菜單的功能:我想你最好做一個插件,

void Form1_Click(object sender, EventArgs e) 
    { 
     Proxy proxyServer = new Proxy(); 
     ToolStripMenuItem item = (ToolStripMenuItem)sender; 
     proxyServer.SetProxy(XML.proxy[(int)item.Tag]); 
     proxyServer = null; 
     notifyIcon1.BalloonTipText = XML.proxy[(int)item.Tag].name + " is now your Active Proxy"; 
     notifyIcon1.ShowBalloonTip(1); 
    } 
+0

您是否期待與現有代理服務器建立開放連接以自動連接到新代理的應用程序,還是新的進程沒有啓動代理更改? –

回答

1

從微軟的知識庫:How to programmatically query and set proxy settings under Internet Explorer

注意 INTERNET_OPTION_PER_CONNECTION_OPTION使設置全系統的基礎上,當使用NULL句柄來改變。要正確反映全局代理設置,必須使用INTERNET_OPTION_REFRESH選項標誌調用InternetSetOption函數。

這是從MSDN

INTERNET_OPTION_PER_CONNECTION_OPTION
設置或獲取一個INTERNET_PER_CONN_OPTION_LIST結構,指定爲特定連接選項的列表。這由InternetQueryOption和InternetSetOption使用。此選項僅在Internet Explorer 5及更高版本中有效。

Read about the INTERNET_PER_CONN_OPTION_LIST structure.

注:爲INTERNET_PER_CONN_PROXY_SERVER標誌值爲2

+0

很好,詳細的答案。 –

+0

謝謝。添加標誌值有希望對C#程序員有幫助,但沒有快速參考Windows API,並且它在MSDN上沒有定義。我希望我在上大學時曾想過制定一個計劃來做到這一點。我不得不在3個不同的代理之間手動切換。 – Wolf

+0

我不明白你說的解決方案是。使用NULL句柄,「INTERNET_OPTION_PER_CONNECTION_OPTION」和空的「INTERNET_PER_CONN_OPTION_LIST」來調用InternetSetOption()? –

-1

您瀏覽器而不是直接更改註冊表。

+0

非瀏覽器應用程序如電子郵件客戶端如何? –

0

的RegistryKey類是一次性的。也許它正在被緩存或什麼,嘗試處理它,除了關閉它。

相關問題