C#设置IE代理及遇到问题的解决方案
起初使用的方法是修改完一次代理之后就不能继续修改,需要重新启动一次进程才可以,最初代码是:
- private void ShowProxyInfo()
- {
- if (!GetProxyStatus())
- {
- lblInitInfo.Text = "代理未启用:";
- }
- else
- {
- lblInitInfo.Text = "当前使用的代理是:" + GetProxyServer();
- }
- }
- private void InitProxyData()
- {
- List<string> proxyList = new List<string>{
- "http://web-proxy.cup.hp.com:8080","http://proxy.compaq.com:8080"
- };
- combProxyList.DataSource = proxyList;
- combProxyList.SelectedIndex = ;
- }
- public void SetProxy(string proxy)
- {
- //打开注册表
- //RegistryKey regKey = Registry.CurrentUser;
- //string SubKeyPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
- //RegistryKey optionKey = regKey.OpenSubKey(SubKeyPath, true); //更改健值,设置代理,
- //optionKey.SetValue("ProxyEnable", 1);
- //optionKey.SetValue("ProxyServer", proxy);
- ////激活代理设置【用于即使IE没有关闭也能更新当前打开的IE中的代理设置。】
- //InternetSetOption(0, 39, IntPtr.Zero, 0);
- //InternetSetOption(0, 37, IntPtr.Zero, 0);
- //regKey.Flush(); //刷新注册表
- //regKey.Close();
- //ShowProxyInfo();
- using (RegistryKey regKey = Registry.CurrentUser)
- {
- string SubKeyPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
- RegistryKey optionKey = regKey.OpenSubKey(SubKeyPath, true); //更改健值,设置代理
- optionKey.SetValue("ProxyEnable", );
- optionKey.SetValue("ProxyServer", proxy);
- //激活代理设置【用于即使IE没有关闭也能更新当前打开的IE中的代理设置。】
- InternetSetOption(, , IntPtr.Zero, );
- InternetSetOption(, , IntPtr.Zero, );
- regKey.Flush(); //刷新注册表
- ShowProxyInfo();
- }
- }
- public void DisableProxy()
- {
- //打开注册表
- RegistryKey regKey = Registry.CurrentUser;
- string SubKeyPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
- RegistryKey optionKey = regKey.OpenSubKey(SubKeyPath, true); //更改健值,设置代理,
- optionKey.SetValue("ProxyEnable", );
- regKey.Flush(); //刷新注册表
- InternetSetOption(, , IntPtr.Zero, );
- InternetSetOption(, , IntPtr.Zero, );
- regKey.Close();
- ShowProxyInfo();
- }
- [DllImport(@"wininet", SetLastError = true, CharSet = CharSet.Auto,
- EntryPoint = "InternetSetOption",
- CallingConvention = CallingConvention.StdCall)]
- public static extern bool InternetSetOption(
- int hInternet, int dmOption, IntPtr lpBuffer, int dwBufferLength);
- private void btnSetProxy_Click(object sender, EventArgs e)
- {
- string proxyStr = combProxyList.Text.Trim();
- SetProxy(proxyStr);
- var currentProxy = GetProxyServer();
- if (currentProxy == proxyStr && GetProxyStatus())
- {
- lblInfo.Text = "设置代理:" + proxyStr + "成功!";
- lblInfo.ForeColor = Color.Green;
- }
- else
- {
- if (!GetProxyStatus())
- {
- lblInfo.Text = "设置代理:" + proxyStr + "代理未启用!";
- }
- else
- {
- lblInfo.Text = "设置代理:" + proxyStr + "失败,正在使用" + currentProxy + "代理,请重试!";
- }
- lblInfo.ForeColor = Color.Red;
- }
- ShowProxyInfo();
- }
- /// <summary>
- /// 获取正在使用的代理
- /// </summary>
- /// <returns></returns>
- private string GetProxyServer()
- {
- //打开注册表
- RegistryKey regKey = Registry.CurrentUser;
- string SubKeyPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
- RegistryKey optionKey = regKey.OpenSubKey(SubKeyPath, true); //更改健值,设置代理,
- string actualProxy = optionKey.GetValue("ProxyServer").ToString();
- regKey.Close();
- return actualProxy;
- }
- private bool GetProxyStatus()
- {
- //打开注册表
- RegistryKey regKey = Registry.CurrentUser;
- string SubKeyPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
- RegistryKey optionKey = regKey.OpenSubKey(SubKeyPath, true); //更改健值,设置代理,
- int actualProxyStatus = Convert.ToInt32(optionKey.GetValue("ProxyEnable"));
- regKey.Close();
- return actualProxyStatus == ? true : false;
- }
- //成功返回true,错误返回false
- public Boolean prcessBaidu()
- {
- HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("http://www.163.com");
- myRequest.Method = "POST"; //采用post方式提交访问163主页 // Get response
- try//当无法访问163网站时,下面的对象会有错误产生,所以用try..catch处理掉这些异常
- {
- Stream newStream = myRequest.GetRequestStream();//获取请求流 // Send the data.
- newStream.Close();//关闭请求流
- HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();//获取应答对象
- StreamReader reader = new StreamReader(myResponse.GetResponseStream());//获取应答流
- string content = reader.ReadToEnd();//将流对象读取到string 中
- if (content.IndexOf("http://reg.163.com") > -)//如果访问网站成功,则网页中包含置顶的关键字符串“http://reg.163.com”表示访问网页成功
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- catch (Exception ex)
- {
- return false;
- }
- return false;
- }
- private void btnDisableProxy_Click(object sender, EventArgs e)
- {
- DisableProxy();
- if (!GetProxyStatus())
- {
- lblInfo.Text = "取消代理完成!";
- lblInfo.ForeColor = Color.Green;
- }
- else
- {
- lblInfo.Text = "取消失败,正在使用代理" + GetProxyServer();
- lblInfo.ForeColor = Color.Red;
- }
- ShowProxyInfo();
- }
- private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
- {
- }
- private void btnTestProxy_Click(object sender, EventArgs e)
- {
- string proxyStr = combProxyList.SelectedText;
- SetProxy(proxyStr);
- if (prcessBaidu())
- {
- MessageBox.Show("代理可以正常访问。");
- }
- else
- {
- MessageBox.Show("目前无法使用代理!");
- }
- ShowProxyInfo();
- }
有网友的结果是说在window7下, 在一个进程中, 设置和取消不能都执行,---- 要么设置,要么取消。 但如果第一次运行时,只进行设置代理,退出后再进运行,只进行取消,这是没有问题的。简单说说他给出的解决方案:每次设置或取消代理时,都新建一个进程,在新的进程中处理,处理完之后关掉进程。参考http://blog.csdn.net/debug__boy/article/details/8432879提供新的解决方案,国外大神的文章http://huddledmasses.org/setting-windows-internet-connection-proxy-from-c/:代码如下:
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Text;
- using System.Threading.Tasks;
- namespace IEProxyManagment
- {
- public class IEProxySetting
- {
- 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) ? : (string.IsNullOrEmpty(exceptions) ? : );
- InternetConnectionOption[] options = new InternetConnectionOption[optionCount];
- // USE a proxy server ...
- options[].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS;
- options[].m_Value.m_Int = (int)((optionCount < ) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY));
- // use THIS proxy server
- if (optionCount > )
- {
- options[].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER;
- options[].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(strProxy);
- // except for these addresses ...
- if (optionCount > )
- {
- options[].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS;
- options[].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(exceptions);
- }
- }
- // default stuff
- list.dwSize = Marshal.SizeOf(list);
- list.szConnection = IntPtr.Zero;
- list.dwOptionCount = options.Length;
- list.dwOptionError = ;
- 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 = ; 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) ? - : ;
- if (returnvalue == )
- { // get the error codes, they might be helpful
- returnvalue = Marshal.GetLastWin32Error();
- }
- // FREE the data ASAP
- Marshal.FreeCoTaskMem(optionsPtr);
- Marshal.FreeCoTaskMem(ipcoListPtr);
- if (returnvalue > )
- { // throw the error codes, they might be helpful
- throw new Win32Exception(Marshal.GetLastWin32Error());
- }
- return (returnvalue < );
- }
- }
- #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()]
- public System.Runtime.InteropServices.ComTypes.FILETIME m_FileTime;
- [FieldOffset()]
- public int m_Int;
- [FieldOffset()]
- public IntPtr m_StringPtr;
- }
- }
- #endregion
- #region WinInet enums
- //
- // options manifests for Internet{Query|Set}Option
- //
- public enum InternetOption : uint
- {
- INTERNET_OPTION_PER_CONNECTION_OPTION =
- }
- //
- // Options used in INTERNET_PER_CONN_OPTON struct
- //
- public enum PerConnOption
- {
- INTERNET_PER_CONN_FLAGS = , // Sets or retrieves the connection type. The Value member will contain one or more of the values from PerConnFlags
- INTERNET_PER_CONN_PROXY_SERVER = , // Sets or retrieves a string containing the proxy servers.
- INTERNET_PER_CONN_PROXY_BYPASS = , // Sets or retrieves a string containing the URLs that do not use the proxy server.
- INTERNET_PER_CONN_AUTOCONFIG_URL = //, // 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);
- }
- }
UnsetProxy方法为取消代理设置,SetProxy(string strProxy, string exceptions)方法为设置指定代理。
以下是我做的一个可以动态修改代理的Winform程序,备忘下载。
C#设置IE代理及遇到问题的解决方案的更多相关文章
- C#设置通过代理访问ftp服务器
// 创建FTP连接 private FtpWebRequest CreateFtpWebRequest(string uri, string requestMethod) { FtpWebReque ...
- atitit agt sys 设置下级代理功能设计.docx
atitit agt sys 设置下级代理功能设计.docx 显示界面1 先查询显示 set_sub.js1 设置代理2 /atiplat_cms/src/com/attilax/user/Agent ...
- Nginx_地址重写(rewrite)_日志管理(log_format)_压缩输出_Nginx设定限速_Nginx设置反向代理及反向代理缓存
Nginx地址重写 Nginx rewrite rewrite语法规则1).变量名可以使用 "=" 或 "!=" 运算符~ 区分大小写~* 不区分大小写^~ 禁 ...
- maven3实战之设置HTTP代理
maven3实战之设置HTTP代理 ---------- 有时候你所在的公司基于安全因素考虑,要求你使用通过安全认证的代理访问因特网.这种情况下,就需要为Maven配置HTTP代理,才能让它正常访问外 ...
- 快捷设置IE代理小工具
时间:2015-02-06 起因: 公司新装了PLM系统,用这个系统必须使用指定IP段的IP才能访问.所以为了还能愉快的继续使用代理进行特定网站的访问,我们必须要频繁的去设置IE代理,这也太麻烦了吧. ...
- 设置HTTP代理
Maven通过<<UserHome>>/.m2/settings.xml(如果没有该文件,复制<<MavenHome>>/conf/settings.x ...
- 在cocos2d-x jsb/html5中设置触摸代理的方法
和官方的说明不同,js binding的很多api和ch5版是不一样的.遇到不一样的就需要我们努力去看源码寻找了. 主要是以下几个文件 cocos2d_specifics.cpp cocos2d_sp ...
- 转:设置HtmlUnitDriver代理及处理用户验证有关问题
selenium2 提供了一种无ui模式的driver,即htmlunitdriver.特点运行比较快.其实htmlunitdriver 是对htmlunit 的封装,这样大家就可以使用自己习惯sel ...
- 主机设置ss代理,虚拟机共享代理
代理的原理: 关于代理的具体的书面定义你百度谷歌可以知道.这里,我想简单通过一个例子,说明代理的原理: 假如,你在北京,但你女朋友在广州,你有东西要给你的女朋友,但是正好你这几天公司有事,所以你不能去 ...
随机推荐
- eclipse使用sublime配色(转)
转自 Eclipse设置类似Sublime Text 编辑区皮肤,风格,颜色 1.首先打开eclipse 2.help -> Install New SoftWare 3.点击 Add 在Na ...
- C语言基础(11)-随机数发生器
一. rand() rand是一个C语言库函数,功能是生成一个随机数.rand需要一个不同的种子,才能生成不同的随机数. 二. srand(int seed) rand需要一个不同的种子,才能生成不同 ...
- linux 远程连接工具——MTPuTTY
简介 MTPUTTY是一个非常流行的ssh客户端. 安装 官网地址:http://www.ttyplus.com/multi-tabbed-putty/ 下载并安装,运行软件,如图 添加服务器 结语 ...
- 第4天--linux内核学习
驱动使用方式1.编译到内核中 * make uImage进入到系统后mknod /dev/led c 500 0 创建设备节点 2.编译为模块 M make module进入到系统后 mknod /d ...
- 执行mvn 报错 source-1.5 中不支持 diamond运算符
编译版本出现了问题 <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> < ...
- Windows 安装JRuby 生成 war 到 tomcat 运行
Windows安装JRuby Rails 直接下载 JRuby,不装 Ruby. http://jruby.org/download 该安装包可以配好环境变量 %JRUBY_HOME% 等 安装 bu ...
- 使用mysqlslap对mysql进行压测,观察Azure虚拟机cpu使用率
一直想做这个测试,原因很简单,很多人一直比较怀疑Azure的虚拟机性能,说相同的配置凭啥比阿里的虚拟机贵那么多,其实,我自己以前也怀疑过,但是接触Azure的几个月,确实发现Azure的虚拟机性能真的 ...
- iOS小Tip之查看FPS
可能大家有的时候会想要查看app在运行时的帧率能否达到60帧,如果达不到的话,你可能会想着去优化动画或者其它任何会影响显示性能的问题. 但是,你首先要观察到你的FPS,对吧? 我告诉大家一个简单的方法 ...
- 盘点8种CSS实现垂直居中水平居中的绝对定位居中技术
Ⅰ.绝对定位居中(Absolute Centering)技术 我们经常用margin:0 auto来实现水平居中,而一直认为margin:auto不能实现垂直居中--实际上,实现垂直居中仅需要声明元素 ...
- ng-repeat 里 使用ng-show ng-hide出现闪动
在项目中使用ng-repeat在表格中循环输出一组数据的时候,需要对表格中的每一列(每一列为数组的一个元素--对象)添加控制按钮. 列表样式 我的期望是 初始化 ----每一行不可编辑,保存按钮是隐藏 ...