2013-11-25 57 views
2

很多搜​​索我發現下面的代碼成功地設置在Internet選項窗格中的代理在Windows後刪除IE代理:如何編程方式使用C#

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

RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);    
registry.SetValue("ProxyEnable", 1); 
registry.SetValue("ProxyServer", "127.0.0.1:1234"); 
settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0); 
refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0); 

問題是當我嘗試刪除代理服務器。我嘗試了很多東西,但我無法正常工作。我曾嘗試下面的代碼塊:

RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); 
registry.SetValue("ProxyEnable", 0);      
settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0); 
refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0); 

我也試圖通過在碼塊以下面的行替換設定值爲0以上刪除「ProxyEnable」鍵:

registry.DeleteValue("ProxyEnable"); 

任何人都可以請幫忙嗎?

+0

嘗試使用registry.SetValue(「ProxyDisable」,1);只是一個猜測:D –

回答

1

我剛剛找到答案。需要使用下面的類來正確馬歇爾來電來贏API:

namespace PoshHttp 
{ 

    public class Proxies 
    { 
     public static bool UnsetProxy() 
     { 
      return SetProxy(null, null); 
     } 
     public static bool SetProxy(string strProxy) 
     { 
      return SetProxy(strProxy, null); 
     } 

     public static bool SetProxy(string strProxy, string exceptions) 
     { 
      InternetPerConnOptionList list = new InternetPerConnOptionList(); 

      int optionCount = string.IsNullOrEmpty(strProxy) ? 1 : (string.IsNullOrEmpty(exceptions) ? 2 : 3); 
      InternetConnectionOption[] options = new InternetConnectionOption[optionCount]; 
      // USE a proxy server ... 
      options[0].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; 
      options[0].m_Value.m_Int = (int)((optionCount < 2) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY)); 
      // use THIS proxy server 
      if (optionCount > 1) 
      { 
       options[1].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; 
       options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(strProxy); 
       // except for these addresses ... 
       if (optionCount > 2) 
       { 
        options[2].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS; 
        options[2].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(exceptions); 
       } 
      } 

      // default stuff 
      list.dwSize = Marshal.SizeOf(list); 
      list.szConnection = IntPtr.Zero; 
      list.dwOptionCount = options.Length; 
      list.dwOptionError = 0; 


      int optSize = Marshal.SizeOf(typeof(InternetConnectionOption)); 
      // make a pointer out of all that ... 
      IntPtr optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length); 
      // copy the array over into that spot in memory ... 
      for (int i = 0; i < options.Length; ++i) 
      { 
       IntPtr opt = new IntPtr(optionsPtr.ToInt32() + (i * optSize)); 
       Marshal.StructureToPtr(options[i], opt, false); 
      } 

      list.options = optionsPtr; 

      // and then make a pointer out of the whole list 
      IntPtr ipcoListPtr = Marshal.AllocCoTaskMem((Int32)list.dwSize); 
      Marshal.StructureToPtr(list, ipcoListPtr, false); 

      // and finally, call the API method! 
      int returnvalue = NativeMethods.InternetSetOption(IntPtr.Zero, 
                   InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION, 
                   ipcoListPtr, list.dwSize) ? -1 : 0; 
      if (returnvalue == 0) 
      { // get the error codes, they might be helpful 
       returnvalue = Marshal.GetLastWin32Error(); 
      } 
      // FREE the data ASAP 
      Marshal.FreeCoTaskMem(optionsPtr); 
      Marshal.FreeCoTaskMem(ipcoListPtr); 
      if (returnvalue > 0) 
      { // throw the error codes, they might be helpful 
       throw new Win32Exception(Marshal.GetLastWin32Error()); 
      } 

      return (returnvalue < 0); 
     } 
    } 

    #region WinInet structures 
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
    public struct InternetPerConnOptionList 
    { 
     public int dwSize;    // size of the INTERNET_PER_CONN_OPTION_LIST struct 
     public IntPtr szConnection;   // connection name to set/query options 
     public int dwOptionCount;  // number of options to set/query 
     public int dwOptionError;   // on error, which option failed 
     //[MarshalAs(UnmanagedType.)] 
     public IntPtr options; 
    }; 

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
    public struct InternetConnectionOption 
    { 
     static readonly int Size; 
     public PerConnOption m_Option; 
     public InternetConnectionOptionValue m_Value; 
     static InternetConnectionOption() 
     { 
     InternetConnectionOption.Size = Marshal.SizeOf(typeof(InternetConnectionOption)); 
     } 

     // Nested Types 
     [StructLayout(LayoutKind.Explicit)] 
     public struct InternetConnectionOptionValue 
     { 
     // Fields 
     [FieldOffset(0)] 
     public System.Runtime.InteropServices.ComTypes.FILETIME m_FileTime; 
     [FieldOffset(0)] 
     public int m_Int; 
     [FieldOffset(0)] 
     public IntPtr m_StringPtr; 
     } 
    } 
    #endregion 

    #region WinInet enums 
    // 
    // options manifests for Internet{Query|Set}Option 
    // 
    public enum InternetOption : uint 
    { 
     INTERNET_OPTION_PER_CONNECTION_OPTION = 75 
    } 

    // 
    // Options used in INTERNET_PER_CONN_OPTON struct 
    // 
    public enum PerConnOption 
    { 
     INTERNET_PER_CONN_FLAGS = 1, // Sets or retrieves the connection type. The Value member will contain one or more of the values from PerConnFlags 
     INTERNET_PER_CONN_PROXY_SERVER = 2, // Sets or retrieves a string containing the proxy servers. 
     INTERNET_PER_CONN_PROXY_BYPASS = 3, // Sets or retrieves a string containing the URLs that do not use the proxy server. 
     INTERNET_PER_CONN_AUTOCONFIG_URL = 4//, // Sets or retrieves a string containing the URL to the automatic configuration script. 

    } 

    // 
    // PER_CONN_FLAGS 
    // 
    [Flags] 
    public enum PerConnFlags 
    { 
     PROXY_TYPE_DIRECT = 0x00000001, // direct to net 
     PROXY_TYPE_PROXY = 0x00000002, // via named proxy 
     PROXY_TYPE_AUTO_PROXY_URL = 0x00000004, // autoproxy URL 
     PROXY_TYPE_AUTO_DETECT = 0x00000008 // use autoproxy detection 
    } 
    #endregion 

    internal static class NativeMethods 
    { 
     [DllImport("WinInet.dll", SetLastError = true, CharSet = CharSet.Auto)] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     public static extern bool InternetSetOption(IntPtr hInternet, InternetOption dwOption, IntPtr lpBuffer, int dwBufferLength); 
    } 
} 

的完整描述可以發現on this blog,我已經包含在參考的情況下代碼的博客是未來下來。

0

您可以通過此代碼將所有代理項目禁用爲小菜一碟。

RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); 
if (registry.GetValue("AutoConfigURL") != null) 
{ 
    registry.DeleteValue("AutoConfigURL"); 
} 
registry.SetValue("ProxyEnable", 0, RegistryValueKind.DWord); 
registry.SetValue("ProxyServer", ""); 
registry.SetValue("MigrateProxy", 0, RegistryValueKind.DWord); 
registry.SetValue("ProxyHttp1.1", 0, RegistryValueKind.DWord); 
registry.SetValue("ProxyOverride", ""); 
registry.Flush(); 

希望我能幫助你。

相關問題