2014-01-20 84 views
4

我試圖使用Windows註冊表來啓用/禁用Windows全局代理(在Internet選項中)。如果我設置了該值,則不會有任何問題,但會刷新設置。搜索後,我在SO上發現了一個提供代碼的問題。但現在的問題是,在應用程序的每個會話中,它只能運行一次。即它第一次工作,如果您希望它再次運行,則必須重新運行應用程序。任何想法可能是什麼問題?這裏的代碼設置全局代理設置後無法刷新窗口

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using Microsoft.Win32; 
using System.Runtime.InteropServices; 

namespace SystemProxyToggle 
{ 
    public partial class Form1 : Form 
    { 
     [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 Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      queryStatus(); 
     } 

     private void btnToggle_Click(object sender, EventArgs e) 
     { 
      toggleStatus(); 
      queryStatus(); 
     } 

     private void queryStatus() 
     { 
      RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); 
      int status = (int)registry.GetValue("ProxyEnable"); 
      if (status == 0) 
      { 
       lblStatus.Text = "Proxy Is Disabled"; 
       lblStatus.ForeColor = Color.Maroon; 
      } 
      else 
      { 
       lblStatus.Text = "Proxy Is Enabled"; 
       lblStatus.ForeColor = Color.Green; 
      } 

      //I added this after I encountered the problem 
      //though I don't that this is the problem 
      registry.Close(); 
     } 

     private void toggleStatus() 
     { 
      RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); 
      int status = (int)registry.GetValue("ProxyEnable"); 
      if (status == 1) 
      { 
       registry.SetValue("ProxyEnable", 0); 
      } 
      else 
      { 
       registry.SetValue("ProxyEnable", 1); 
      } 
      //Refresh System Settings 
      settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0); 
      refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0); 

      //I added this after I encountered the problem 
      registry.Close(); 
     } 
    } 
} 
+1

我不認爲我很理解你的問題,我只是執行你的代碼,它似乎按預期工作。我運行它,顯示我的代理被禁用。我按下按鈕,代理被啓用,再次按下它,它被禁用..什麼似乎是這個問題? – Dayan

+0

同樣在這裏,運行代碼沒有問題。 – tweellt

+4

一個完全瘋狂的猜測,因爲其他人可以成功地運行你的程序,你有沒有安裝任何軟件來保護你的註冊表?防病毒?也許一些域控制的東西?我曾經有一個奇怪的問題,即我的IE首頁被重置,無論我做了什麼,都以各種方式編輯註冊表。事實證明,這是因爲它通過了我的電腦所在的域。 – Heki

回答

0

對於其他人被困在這個問題上,一些奇怪的似乎做的伎倆我。

我只是刪除/評論()

//settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0); 
//refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0); 

重新啓動程序中的所有調用InternetSetOption,這一次的註冊表更改生效在兩個方向上,只要我想要的,不只是第一次。

1

我測試在Windows 7(IE瀏覽器11)此代碼,並沒有任何問題,但是當我在第二系統試圖與Windows 8,我有相同的結果,你沒有。

挖了一段時間後,我發現,你應該叫InternetSetOption不同,基本上是這樣的:

INTERNET_OPTION_PROXY_SETTINGS_CHANGED = 95 

InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY_SETTINGS_CHANGED, IntPtr.Zero, 0); 

我再次試圖在兩個系統和它的工作就好了。

乾杯

+0

感謝您的答案,但不幸的是你建議不能解決我的問題。我添加了呼叫,並且沒有INTERNET_OPTION_SETTINGS_CHANGED。而且我正在運行Win7_x64 –

+0

這很奇怪,它在我身邊運行正常,並帶有INTERNET_OPTION_SETTINGS_CHANGED! – tweellt