起初使用的方法是修改完一次代理之后就不能继续修改,需要重新启动一次进程才可以,最初代码是:

  1. private void ShowProxyInfo()
  2. {
  3. if (!GetProxyStatus())
  4. {
  5. lblInitInfo.Text = "代理未启用:";
  6. }
  7. else
  8. {
  9. lblInitInfo.Text = "当前使用的代理是:" + GetProxyServer();
  10. }
  11.  
  12. }
  13.  
  14. private void InitProxyData()
  15. {
  16. List<string> proxyList = new List<string>{
  17. "http://web-proxy.cup.hp.com:8080","http://proxy.compaq.com:8080"
  18. };
  19. combProxyList.DataSource = proxyList;
  20. combProxyList.SelectedIndex = ;
  21. }
  22. public void SetProxy(string proxy)
  23. {
  24. //打开注册表 
  25. //RegistryKey regKey = Registry.CurrentUser;
  26. //string SubKeyPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
  27. //RegistryKey optionKey = regKey.OpenSubKey(SubKeyPath, true);             //更改健值,设置代理, 
  28. //optionKey.SetValue("ProxyEnable", 1);
  29. //optionKey.SetValue("ProxyServer", proxy);
  30.  
  31. ////激活代理设置【用于即使IE没有关闭也能更新当前打开的IE中的代理设置。】   
  32. //InternetSetOption(0, 39, IntPtr.Zero, 0);
  33. //InternetSetOption(0, 37, IntPtr.Zero, 0);
  34. //regKey.Flush(); //刷新注册表
  35. //regKey.Close();
  36. //ShowProxyInfo();
  37.  
  38. using (RegistryKey regKey = Registry.CurrentUser)
  39. {
  40. string SubKeyPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
  41. RegistryKey optionKey = regKey.OpenSubKey(SubKeyPath, true);             //更改健值,设置代理
  42. optionKey.SetValue("ProxyEnable", );
  43. optionKey.SetValue("ProxyServer", proxy);
  44. //激活代理设置【用于即使IE没有关闭也能更新当前打开的IE中的代理设置。】   
  45. InternetSetOption(, , IntPtr.Zero, );
  46. InternetSetOption(, , IntPtr.Zero, );
  47. regKey.Flush(); //刷新注册表
  48. ShowProxyInfo();
  49. }
  50.  
  51. }
  52.  
  53. public void DisableProxy()
  54. {
  55. //打开注册表 
  56. RegistryKey regKey = Registry.CurrentUser;
  57. string SubKeyPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
  58. RegistryKey optionKey = regKey.OpenSubKey(SubKeyPath, true);             //更改健值,设置代理, 
  59. optionKey.SetValue("ProxyEnable", );
  60. regKey.Flush(); //刷新注册表
  61. InternetSetOption(, , IntPtr.Zero, );
  62. InternetSetOption(, , IntPtr.Zero, );
  63. regKey.Close();
  64. ShowProxyInfo();
  65. }
  66.  
  67. [DllImport(@"wininet", SetLastError = true, CharSet = CharSet.Auto,
  68. EntryPoint = "InternetSetOption",
  69. CallingConvention = CallingConvention.StdCall)]
  70. public static extern bool InternetSetOption(
  71. int hInternet, int dmOption, IntPtr lpBuffer, int dwBufferLength);
  72.  
  73. private void btnSetProxy_Click(object sender, EventArgs e)
  74. {
  75. string proxyStr = combProxyList.Text.Trim();
  76. SetProxy(proxyStr);
  77. var currentProxy = GetProxyServer();
  78. if (currentProxy == proxyStr && GetProxyStatus())
  79. {
  80. lblInfo.Text = "设置代理:" + proxyStr + "成功!";
  81. lblInfo.ForeColor = Color.Green;
  82. }
  83. else
  84. {
  85. if (!GetProxyStatus())
  86. {
  87. lblInfo.Text = "设置代理:" + proxyStr + "代理未启用!";
  88.  
  89. }
  90. else
  91. {
  92. lblInfo.Text = "设置代理:" + proxyStr + "失败,正在使用" + currentProxy + "代理,请重试!";
  93.  
  94. }
  95. lblInfo.ForeColor = Color.Red;
  96. }
  97. ShowProxyInfo();
  98.  
  99. }
  100.  
  101. /// <summary>
  102. /// 获取正在使用的代理
  103. /// </summary>
  104. /// <returns></returns>
  105. private string GetProxyServer()
  106. {
  107. //打开注册表 
  108. RegistryKey regKey = Registry.CurrentUser;
  109. string SubKeyPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
  110. RegistryKey optionKey = regKey.OpenSubKey(SubKeyPath, true);             //更改健值,设置代理, 
  111. string actualProxy = optionKey.GetValue("ProxyServer").ToString();
  112. regKey.Close();
  113. return actualProxy;
  114. }
  115.  
  116. private bool GetProxyStatus()
  117. {
  118. //打开注册表 
  119. RegistryKey regKey = Registry.CurrentUser;
  120. string SubKeyPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
  121. RegistryKey optionKey = regKey.OpenSubKey(SubKeyPath, true);             //更改健值,设置代理, 
  122. int actualProxyStatus = Convert.ToInt32(optionKey.GetValue("ProxyEnable"));
  123. regKey.Close();
  124. return actualProxyStatus == ? true : false;
  125. }
  126.  
  127. //成功返回true,错误返回false  
  128. public Boolean prcessBaidu()
  129. {
  130. HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("http://www.163.com");
  131. myRequest.Method = "POST"; //采用post方式提交访问163主页 // Get response      
  132. try//当无法访问163网站时,下面的对象会有错误产生,所以用try..catch处理掉这些异常     
  133. {
  134. Stream newStream = myRequest.GetRequestStream();//获取请求流     // Send the data.         
  135. newStream.Close();//关闭请求流 
  136. HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();//获取应答对象    
  137. StreamReader reader = new StreamReader(myResponse.GetResponseStream());//获取应答流     
  138. string content = reader.ReadToEnd();//将流对象读取到string 中 
  139. if (content.IndexOf("http://reg.163.com") > -)//如果访问网站成功,则网页中包含置顶的关键字符串“http://reg.163.com”表示访问网页成功    
  140. {
  141. return true;
  142. }
  143. else
  144. {
  145. return false;
  146. }
  147. }
  148. catch (Exception ex)
  149. {
  150. return false;
  151. }
  152. return false;
  153. }
  154.  
  155. private void btnDisableProxy_Click(object sender, EventArgs e)
  156. {
  157. DisableProxy();
  158.  
  159. if (!GetProxyStatus())
  160. {
  161. lblInfo.Text = "取消代理完成!";
  162. lblInfo.ForeColor = Color.Green;
  163. }
  164. else
  165. {
  166. lblInfo.Text = "取消失败,正在使用代理" + GetProxyServer();
  167. lblInfo.ForeColor = Color.Red;
  168. }
  169. ShowProxyInfo();
  170. }
  171.  
  172. private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
  173. {
  174.  
  175. }
  176.  
  177. private void btnTestProxy_Click(object sender, EventArgs e)
  178. {
  179. string proxyStr = combProxyList.SelectedText;
  180. SetProxy(proxyStr);
  181. if (prcessBaidu())
  182. {
  183. MessageBox.Show("代理可以正常访问。");
  184. }
  185. else
  186. {
  187. MessageBox.Show("目前无法使用代理!");
  188. }
  189. ShowProxyInfo();
  190. }

  有网友的结果是说在window7下, 在一个进程中, 设置和取消不能都执行,---- 要么设置,要么取消。 但如果第一次运行时,只进行设置代理,退出后再进运行,只进行取消,这是没有问题的。简单说说他给出的解决方案:每次设置或取消代理时,都新建一个进程,在新的进程中处理,处理完之后关掉进程。参考http://blog.csdn.net/debug__boy/article/details/8432879提供新的解决方案,国外大神的文章http://huddledmasses.org/setting-windows-internet-connection-proxy-from-c/:代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using System.Runtime.InteropServices;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8.  
  9. namespace IEProxyManagment
  10. {
  11.  
  12. public class IEProxySetting
  13. {
  14. public static bool UnsetProxy()
  15. {
  16. return SetProxy(null, null);
  17. }
  18. public static bool SetProxy(string strProxy)
  19. {
  20. return SetProxy(strProxy, null);
  21. }
  22.  
  23. public static bool SetProxy(string strProxy, string exceptions)
  24. {
  25. InternetPerConnOptionList list = new InternetPerConnOptionList();
  26.  
  27. int optionCount = string.IsNullOrEmpty(strProxy) ? : (string.IsNullOrEmpty(exceptions) ? : );
  28. InternetConnectionOption[] options = new InternetConnectionOption[optionCount];
  29. // USE a proxy server ...
  30. options[].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS;
  31. options[].m_Value.m_Int = (int)((optionCount < ) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY));
  32. // use THIS proxy server
  33. if (optionCount > )
  34. {
  35. options[].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER;
  36. options[].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(strProxy);
  37. // except for these addresses ...
  38. if (optionCount > )
  39. {
  40. options[].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS;
  41. options[].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(exceptions);
  42. }
  43. }
  44.  
  45. // default stuff
  46. list.dwSize = Marshal.SizeOf(list);
  47. list.szConnection = IntPtr.Zero;
  48. list.dwOptionCount = options.Length;
  49. list.dwOptionError = ;
  50.  
  51. int optSize = Marshal.SizeOf(typeof(InternetConnectionOption));
  52. // make a pointer out of all that ...
  53. IntPtr optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length);
  54. // copy the array over into that spot in memory ...
  55. for (int i = ; i < options.Length; ++i)
  56. {
  57. IntPtr opt = new IntPtr(optionsPtr.ToInt32() + (i * optSize));
  58. Marshal.StructureToPtr(options[i], opt, false);
  59. }
  60.  
  61. list.options = optionsPtr;
  62.  
  63. // and then make a pointer out of the whole list
  64. IntPtr ipcoListPtr = Marshal.AllocCoTaskMem((Int32)list.dwSize);
  65. Marshal.StructureToPtr(list, ipcoListPtr, false);
  66.  
  67. // and finally, call the API method!
  68. int returnvalue = NativeMethods.InternetSetOption(IntPtr.Zero,
  69. InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION,
  70. ipcoListPtr, list.dwSize) ? - : ;
  71. if (returnvalue == )
  72. { // get the error codes, they might be helpful
  73. returnvalue = Marshal.GetLastWin32Error();
  74. }
  75. // FREE the data ASAP
  76. Marshal.FreeCoTaskMem(optionsPtr);
  77. Marshal.FreeCoTaskMem(ipcoListPtr);
  78. if (returnvalue > )
  79. { // throw the error codes, they might be helpful
  80. throw new Win32Exception(Marshal.GetLastWin32Error());
  81. }
  82.  
  83. return (returnvalue < );
  84. }
  85. }
  86.  
  87. #region WinInet structures
  88. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
  89. public struct InternetPerConnOptionList
  90. {
  91. public int dwSize; // size of the INTERNET_PER_CONN_OPTION_LIST struct
  92. public IntPtr szConnection; // connection name to set/query options
  93. public int dwOptionCount; // number of options to set/query
  94. public int dwOptionError; // on error, which option failed
  95. //[MarshalAs(UnmanagedType.)]
  96. public IntPtr options;
  97. };
  98.  
  99. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
  100. public struct InternetConnectionOption
  101. {
  102. static readonly int Size;
  103. public PerConnOption m_Option;
  104. public InternetConnectionOptionValue m_Value;
  105. static InternetConnectionOption()
  106. {
  107. InternetConnectionOption.Size = Marshal.SizeOf(typeof(InternetConnectionOption));
  108. }
  109.  
  110. // Nested Types
  111. [StructLayout(LayoutKind.Explicit)]
  112. public struct InternetConnectionOptionValue
  113. {
  114. // Fields
  115. [FieldOffset()]
  116. public System.Runtime.InteropServices.ComTypes.FILETIME m_FileTime;
  117. [FieldOffset()]
  118. public int m_Int;
  119. [FieldOffset()]
  120. public IntPtr m_StringPtr;
  121. }
  122. }
  123. #endregion
  124.  
  125. #region WinInet enums
  126. //
  127. // options manifests for Internet{Query|Set}Option
  128. //
  129. public enum InternetOption : uint
  130. {
  131. INTERNET_OPTION_PER_CONNECTION_OPTION =
  132. }
  133.  
  134. //
  135. // Options used in INTERNET_PER_CONN_OPTON struct
  136. //
  137. public enum PerConnOption
  138. {
  139. INTERNET_PER_CONN_FLAGS = , // Sets or retrieves the connection type. The Value member will contain one or more of the values from PerConnFlags
  140. INTERNET_PER_CONN_PROXY_SERVER = , // Sets or retrieves a string containing the proxy servers.
  141. INTERNET_PER_CONN_PROXY_BYPASS = , // Sets or retrieves a string containing the URLs that do not use the proxy server.
  142. INTERNET_PER_CONN_AUTOCONFIG_URL = //, // Sets or retrieves a string containing the URL to the automatic configuration script.
  143.  
  144. }
  145.  
  146. //
  147. // PER_CONN_FLAGS
  148. //
  149. [Flags]
  150. public enum PerConnFlags
  151. {
  152. PROXY_TYPE_DIRECT = 0x00000001, // direct to net
  153. PROXY_TYPE_PROXY = 0x00000002, // via named proxy
  154. PROXY_TYPE_AUTO_PROXY_URL = 0x00000004, // autoproxy URL
  155. PROXY_TYPE_AUTO_DETECT = 0x00000008 // use autoproxy detection
  156. }
  157. #endregion
  158.  
  159. internal static class NativeMethods
  160. {
  161. [DllImport("WinInet.dll", SetLastError = true, CharSet = CharSet.Auto)]
  162. [return: MarshalAs(UnmanagedType.Bool)]
  163. public static extern bool InternetSetOption(IntPtr hInternet, InternetOption dwOption, IntPtr lpBuffer, int dwBufferLength);
  164. }
  165. }

  UnsetProxy方法为取消代理设置,SetProxy(string strProxy, string exceptions)方法为设置指定代理。

  以下是我做的一个可以动态修改代理的Winform程序,备忘下载

C#设置IE代理及遇到问题的解决方案的更多相关文章

  1. C#设置通过代理访问ftp服务器

    // 创建FTP连接 private FtpWebRequest CreateFtpWebRequest(string uri, string requestMethod) { FtpWebReque ...

  2. atitit agt sys 设置下级代理功能设计.docx

    atitit agt sys 设置下级代理功能设计.docx 显示界面1 先查询显示 set_sub.js1 设置代理2 /atiplat_cms/src/com/attilax/user/Agent ...

  3. Nginx_地址重写(rewrite)_日志管理(log_format)_压缩输出_Nginx设定限速_Nginx设置反向代理及反向代理缓存

    Nginx地址重写 Nginx rewrite rewrite语法规则1).变量名可以使用 "=" 或 "!=" 运算符~ 区分大小写~* 不区分大小写^~ 禁 ...

  4. maven3实战之设置HTTP代理

    maven3实战之设置HTTP代理 ---------- 有时候你所在的公司基于安全因素考虑,要求你使用通过安全认证的代理访问因特网.这种情况下,就需要为Maven配置HTTP代理,才能让它正常访问外 ...

  5. 快捷设置IE代理小工具

    时间:2015-02-06 起因: 公司新装了PLM系统,用这个系统必须使用指定IP段的IP才能访问.所以为了还能愉快的继续使用代理进行特定网站的访问,我们必须要频繁的去设置IE代理,这也太麻烦了吧. ...

  6. 设置HTTP代理

    Maven通过<<UserHome>>/.m2/settings.xml(如果没有该文件,复制<<MavenHome>>/conf/settings.x ...

  7. 在cocos2d-x jsb/html5中设置触摸代理的方法

    和官方的说明不同,js binding的很多api和ch5版是不一样的.遇到不一样的就需要我们努力去看源码寻找了. 主要是以下几个文件 cocos2d_specifics.cpp cocos2d_sp ...

  8. 转:设置HtmlUnitDriver代理及处理用户验证有关问题

    selenium2 提供了一种无ui模式的driver,即htmlunitdriver.特点运行比较快.其实htmlunitdriver 是对htmlunit 的封装,这样大家就可以使用自己习惯sel ...

  9. 主机设置ss代理,虚拟机共享代理

    代理的原理: 关于代理的具体的书面定义你百度谷歌可以知道.这里,我想简单通过一个例子,说明代理的原理: 假如,你在北京,但你女朋友在广州,你有东西要给你的女朋友,但是正好你这几天公司有事,所以你不能去 ...

随机推荐

  1. eclipse使用sublime配色(转)

    转自 Eclipse设置类似Sublime Text 编辑区皮肤,风格,颜色 1.首先打开eclipse 2.help -> Install New SoftWare  3.点击 Add 在Na ...

  2. C语言基础(11)-随机数发生器

    一. rand() rand是一个C语言库函数,功能是生成一个随机数.rand需要一个不同的种子,才能生成不同的随机数. 二. srand(int seed) rand需要一个不同的种子,才能生成不同 ...

  3. linux 远程连接工具——MTPuTTY

    简介 MTPUTTY是一个非常流行的ssh客户端. 安装 官网地址:http://www.ttyplus.com/multi-tabbed-putty/ 下载并安装,运行软件,如图 添加服务器 结语 ...

  4. 第4天--linux内核学习

    驱动使用方式1.编译到内核中 * make uImage进入到系统后mknod /dev/led c 500 0 创建设备节点 2.编译为模块 M make module进入到系统后 mknod /d ...

  5. 执行mvn 报错 source-1.5 中不支持 diamond运算符

    编译版本出现了问题 <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> < ...

  6. Windows 安装JRuby 生成 war 到 tomcat 运行

    Windows安装JRuby Rails 直接下载 JRuby,不装 Ruby. http://jruby.org/download 该安装包可以配好环境变量 %JRUBY_HOME% 等 安装 bu ...

  7. 使用mysqlslap对mysql进行压测,观察Azure虚拟机cpu使用率

    一直想做这个测试,原因很简单,很多人一直比较怀疑Azure的虚拟机性能,说相同的配置凭啥比阿里的虚拟机贵那么多,其实,我自己以前也怀疑过,但是接触Azure的几个月,确实发现Azure的虚拟机性能真的 ...

  8. iOS小Tip之查看FPS

    可能大家有的时候会想要查看app在运行时的帧率能否达到60帧,如果达不到的话,你可能会想着去优化动画或者其它任何会影响显示性能的问题. 但是,你首先要观察到你的FPS,对吧? 我告诉大家一个简单的方法 ...

  9. 盘点8种CSS实现垂直居中水平居中的绝对定位居中技术

    Ⅰ.绝对定位居中(Absolute Centering)技术 我们经常用margin:0 auto来实现水平居中,而一直认为margin:auto不能实现垂直居中--实际上,实现垂直居中仅需要声明元素 ...

  10. ng-repeat 里 使用ng-show ng-hide出现闪动

    在项目中使用ng-repeat在表格中循环输出一组数据的时候,需要对表格中的每一列(每一列为数组的一个元素--对象)添加控制按钮. 列表样式 我的期望是 初始化 ----每一行不可编辑,保存按钮是隐藏 ...