博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用程序修改系统(IE)代理设置
阅读量:4964 次
发布时间:2019-06-12

本文共 3399 字,大约阅读时间需要 11 分钟。

 

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

 

这是本人在做的一个前端开发调试工具(),功能是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
proxyLibs = new List
(); 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方法.

打包好的exe文件:

转载于:https://www.cnblogs.com/honghongming/p/3532567.html

你可能感兴趣的文章
(4) Orchard 开发之 Page 的信息存在哪?
查看>>
ASP.NET中 GridView(网格视图)的使用前台绑定
查看>>
深入了解Oracle ASM(二):ASM File number 1 文件目录
查看>>
Boosting(提升方法)之AdaBoost
查看>>
Binding object to winForm controller through VS2010 Designer(通过VS2010设计器将对象绑定到winForm控件上)...
查看>>
Spring Boot实战笔记(二)-- Spring常用配置(Scope、Spring EL和资源调用)
查看>>
SwaggerUI+SpringMVC——构建RestFul API的可视化界面
查看>>
springmvc怎么在启动时自己执行一个线程
查看>>
C# 通知机制 IObserver<T> 和 IObservable<T>
查看>>
Code of Conduct by jsFoundation
查看>>
C#小练习ⅲ
查看>>
电源防反接保护电路
查看>>
arraylist
查看>>
zoj 1649 Rescue (BFS)(转载)
查看>>
2124: 等差子序列 - BZOJ
查看>>
字符串匹配算法综述
查看>>
Linux centosVMware shell 管道符和作业控制、shell变量、环境变量配置文件
查看>>
【设计模式】工厂模式
查看>>
两个表格中数据不用是一一对应关系--来筛选不同数据,或者相同数据
查看>>
客户数据库出现大量cache buffer chains latch
查看>>