文章都是发布在github再转到这边的,这边格式可能会乱掉.博客地址:benqy.com

这是本人在做的一个前端开发调试工具(HttpMock),功能是web服务器+http日记+http代理(类似fiddler),其中的代理功能,需要在web服务启动时,自动去设置各浏览器的代理设置.

我原先是通过写注册表的方式去实现,实现方法很简单,写一个注册表文件,启动的时候自动运行一下这个注册表文件就可以.

修改代理的注册表文件的内容,proxy.reg:

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MigrateProxy"=dword:00000001
"ProxyEnable"=dword:00000001
"ProxyServer"="http=127.0.0.1:17173"

类似的,取消代理的注册表文件,disproxy.reg:

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MigrateProxy"=dword:00000001
"ProxyEnable"=dword:00000000
"ProxyServer"=""

这个方式非常的简单,但是存在一个严重的问题,就是修改完注册表之后,如果不重启ie,代理设置不会马上生效(这样做出来的软件,实在太山寨,简直没法用啊,什么烂软件).

后来,发现fiddler是用wininet这个工具来设置ie代理.因此,google了一番之后,找到了wininet.dll这个东西,然后用.NET写了个简单的命令行工具.功能很简单,直接上代码:

ProxyManager.cs

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Microsoft.Win32; namespace proxysetting
{
public class ProxyManager
{
[DllImport("wininet.dll", SetLastError = true)]
private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lPBuffer, int lpdwBufferLength);
private const int INTERNET_OPTION_REFRESH = 0x000025;
private const int INTERNET_OPTION_SETTINGS_CHANGED = 0x000027;
private const string regeditKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
private List<string> proxyLibs = new List<string>(); private void Reflush()
{
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
} public void Add(string server)
{
this.proxyLibs.Add(server);
} public void Run()
{
RegistryKey key = Registry.CurrentUser.OpenSubKey(regeditKey, true);
key.SetValue("ProxyServer", String.Join(";", this.proxyLibs.ToArray()));
key.SetValue("ProxyEnable", 1);
key.Close();
this.Reflush();
} public void Stop()
{
RegistryKey key = Registry.CurrentUser.OpenSubKey(regeditKey, true);
key.SetValue("ProxyEnable", 0);
key.Close();
this.Reflush();
}
}
}

ProxyManager类简单的封装wininet.dll的代理设置接口,和使用注册表文件的区别在于this.Reflush()这个方法,强制刷新代理设置,这样就不用重启IE了.

然后是在Main函数里调用:

Program.cs

namespace proxysetting
{
class Program
{
static void Main(string[] args)
{ var pm = new ProxyManager();
if (args.Length < 1) return;
if (args[0] == "stop")
{
pm.Stop();
}
else
{
for (var i = 0; i < args.Length; i++)
{
pm.Add(args[i]);
}
pm.Run();
}
}
}
}

通过命令行参数来设置代理,可以用空格来设置多个协议的代理,如下:

设置http和https代理,代理ip为127.0.0.1,端口号17173
proxysetting http=127.0.0.1:17173 https=127.0.0.1:17173
nodejs中调用:

exports.setProxy = function () {
var exec = require("child_process").exec;
exec(__dirname + 'proxysetting http=127.0.0.1:17173 https=127.0.0.1:17173');
};

取消代理 
proxysetting stop
nodejs中调用:

exports.disProxy = function () {
var exec = require("child_process").exec;
exec(__dirname + 'proxysetting stop');
};

说了那么多,其实就一句话:wininet的this.Reflush方法.

from:http://www.cnblogs.com/honghongming/archive/2014/01/24/3532567.html

【转】使用程序修改系统(IE)代理设置的更多相关文章

  1. 使用程序修改系统(IE)代理设置

    文章都是发布在github再转到这边的,这边格式可能会乱掉.博客地址:benqy.com 这是本人在做的一个前端开发调试工具(HttpMock),功能是web服务器+http日记+http代理(类似f ...

  2. Java如何查找系统的代理设置?

    在Java编程中,如何查找系统的代理设置? 以下示例显示如何使用HttpURLConnection类的systemSetting()方法和getResponse()方法的put方法在系统上查找代理设置 ...

  3. linux系统环境代理设置

    系统上网代理设置: 1.编辑文件/etc/profile,增加如下两行 export http_proxy=http://ip:port export https_proxy=http://ip:po ...

  4. CentOS:设置系统级代理(转)

    原文地址:http://www.cnblogs.com/cocowool/archive/2012/07/05/2578487.html YUM代理设置 编辑/etc/yum.conf,在最后加入 # ...

  5. 怎样让SoapHttpClientProtocol不使用系统默认代理

    方法很简单,但找起来很难. 使用SoapHttpClientProtocol类的Proxy属性. 不能设空值,必须设一个新值. 赶脚底层在链接的时候会判断这个属性是不是null,如果null就会用默认 ...

  6. BurpSuite 代理设置的小技巧

    原文:https://www.anquanke.com/post/id/85925 作者:三思之旅 预估稿费:300RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 在We ...

  7. 【技术分享】BurpSuite 代理设置的小技巧

    作者:三思之旅 预估稿费:300RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 在Web渗透测试过程中,BurpSuite是不可或缺的神器之一.BurpSuite的核心是 ...

  8. Nginx、haproxy反向代理设置

    Nginx反向代理配置: #user nobody; worker_processes ; events { worker_connections ; } http { include mime.ty ...

  9. RedHat中代理设置

    YUM代理设置 编辑/etc/yum.conf,在最后加入 # Proxy proxy=http://username:password@proxy_ip:port/ 也可以使用proxy_usern ...

随机推荐

  1. thinkphp 百度编辑器和layer简单用法

    百度编辑器1.4.3.3和layer插件简单案例 :后台单页面管理 增删改查操作 此处为默认图片保存路径,如果要修改保存路径,需要修改config文件. 添加页. <extend name=&q ...

  2. Access to XMLHttpRequest at 'XXX' from origin 'XX' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present o AJAX跨域请求解决方法

    今天出现了一个问题找了好久先看代码: 这可能是个BUG吧插入代码: dataType: 'jsonp', crossDomain: true, 最终:

  3. angularjs 2.0 简单入门1

    一:首先要写json文件,并下载所有的包 1,在任意目录下新建文件夹 命名为angular2Dome,也可以使用命令  mkdir angular2Dome 回车. 2,在angular2Dome文件 ...

  4. Another kind of Fibonacci(矩阵)

    Another kind of Fibonacci Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  5. First Date (hnoj12952)日期计算

    First Date Time Limit: 3000ms, Special Time Limit:7500ms, Memory Limit:65536KB Total submit users: 7 ...

  6. HDU3359(SummerTrainingDay05-I 高斯消元)

    Kind of a Blur Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. js-jQuery性能优化(一)

    来自于<锋利的jQuery> 1.使用最新版本的jQuery类库 jQuery每一个新的版本都会较上一版本进行BUG修复和一些优化,同时也会包含一些创新,所以建议使用最新版本的jQuery ...

  8. KOTLIN-1(常用网址)

    ---恢复内容开始--- 1.官网:http://kotlinlang.org/ 2.官方文档:https://kotlinlang.org/docs/reference 3.kotlin源码:htt ...

  9. 高性能JavaScript(数据存取)

    数据存取分为4各部分 存取位置 作用域及改变作用域 原型以及原型链 缓存对象成员值 存取位置 JavaScript 有4中基本的数据存取位置 字面量:字面量代表自身,不存于特定的位置.比如这个的匿名函 ...

  10. ConcurrentDictionary的用法

    private static ConcurrentDictionary<Guid, string> dictDbNames = new ConcurrentDictionary<Gu ...