c#如何在win7下设置IE代理的完美解决方案

有人还发现:在window7下, 在一个进程中, 设置和取消不能都执行,---- 要么设置,要么取消。 但如果第一次运行时,只进行设置代理,退出后再进运行,只进行取消,这是没有问题的。 

简单说说中医中药网(www.yiyaojing.com)给出的解决方案:每次设置或取消代理时,都新建一个进程,在新的进程中处理,处理完之后关掉进程。

这种方法可以work,但显得很蛋疼。

所以我没采用这种方法。

最后在同城交友网(www.niyuewo.com)上找到了一个国外一大神 Joel ‘Jaykul‘ Bennett 的一篇文章Setting Windows internet connection proxy from C#

试了一下,完美解决。

代码如下:

using System;
using System.Runtime.InteropServices;
using System.ComponentModel;

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);
   }
}
时间: 2024-10-12 04:07:17

c#如何在win7下设置IE代理的完美解决方案的相关文章

[计算机]如何在win7下查看并更改文件的默认后缀名

如何在win7下查看默认文件的后缀名并更改呢? 例如有一个文件本来是exe,想变更为txt.但是无法看到后缀名,就无法更改. 双击桌面上的计算机图标,或者任意盘符界面,单击如下图左侧“组织”右侧的下拉箭头. 然后单击其中的“文件夹和搜索选项”,然后你就可以看到类似XP下面的设置按钮了:取消掉“隐藏已知文件类型的扩展名”前面的√确定即可.

Win7下设置WiFi热点

Win7下设置WiFi热点 今天研究了下Win7设置WIFI热点,Connectify神马的都是浮云~亲测可用,现拿出来分享下~ 1.点击"开始",再点击"运行",输入"cmd",回车,进入命令行: 2.在命令行下输入命令:"services.msc",弹出"服务"窗口,选择"Windows Firewall",右键点击"属性": 选择"手动",然

navicat for mysql 在win7下设置定时计划之导出数据处理

navicat for mysql 在win7下设置定时计划之导出数据处理 博客分类: mysql navitcatmysql定时任务导出 前两篇记录了,navicat for mysql计划的入门篇和存储过程处理篇,如何制作基本的定时任务,请参看入门篇.本篇记录如何将数据库的数据定时导出成excel(也可以自行选择其他可保存的文件格式). 目的:以test库里的emp表(员工表)为例,将emp表内的数据,定时导出到excel里. 1.在查询选项卡中,打开[查询员工信息表]的查询项,如下图:  

VC、IE、ASP环境下打印、预备的完美解决方案

一种基于XML的报表开发工具,它支持从设计报表,调用API打印.预览,能支持分布式报表.方便报表的存储.转发.在报表中能嵌入VBScript,能方便地访问VB,VC的变量,能访问COM组件.ADO等遵循ActiveX标准的控件. 包括报表可视化开发界面.报表语法解释器,基于COM的组件.是分布式报表的完美解决方案 语法如下: <?xml version="1.0" encoding="GB2312" ?> <!DOCTYPE report SYST

win7下设置虚拟wifi供手机使用

win7下虚拟wifi的设置,网络上很多教程.但我还是自己写下来,方便自己查阅,基本上与网络上的一样. 步骤: 1. 查看网卡是否支持 2.使用命令行执行命令 netsh wlan set hostednetwork mode=allow ssid=wifi_ssid key=wifi_password 3.右键网络->属性->更改适配器设置.找到正在连接网络的网卡,右键属性->共享 勾住下面2个选项框,在家庭网络连接下拉中选择虚拟网卡 4.执行命令行,承载网络 netsh wlan s

如何在Centos下设置Vim的永久显示行号功能?

在Linux系统中,我们经常会使用vi或vim命令,来操作文本,有时候,我们的脚本文件出了错误,会抛出一个带行号的异常,然后我们根据提示,重新打开,我们的源码进行查看,而这时候,如果你的vim没有设置显示行号功能,我们查找出问题的一行的代码,则非常不方便,不知道大家有没有遇到过这种情况. 解决办法如下: (1)cat -n 命令 能够一次性的显示文本的行号,便于我们观察,但是在编辑状态下,是不管用的 (2)配置vim的行号功能,这样就能在任何时候,编辑状态下,也快速定位行号 散仙,建议大家使用第

myeclipse WIN7下设置字体列表中无Courier New

到"C:\Windows\Fonts"下找到对应的字体,单击,选择上面的显示 然后就可以在eclicpse字体设置里面看到Courier New项了: Eclipse字体设置方法: Windows---->Preferences---->General---->Appearance---->Colors and Fonts---->Basic---->Text Fonts,点击右边的Edit.

win7下设置 WiFi AP

开启windows 7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP),就可以让计算机变成无线路由器.实现共享上网. 1.以管理员身份运行命令提示符: “开始”---在搜索栏输入“cmd”----右键以“管理员身份运行” 运行命令: [plain] view plain copy netsh wlan set hostednetwork mode=allow ssid=MyPCAP key=88432700 此命令有三个参数, mode:是否启用虚拟WiFi网卡,改为disallow则为

如何在WIN7下安装虚拟机linux系统

需要支持多个平台的IT管理员经常会遇到如何在Windows 7计算机上安装Linux的问题.幸运的是有多种方法可供选择:双系统.Linux虚拟机和U盘引导. 当需要用到Windows 7和Linux时,双系统环境是很好的选择.但是你必须确保有足够多的硬盘空间来安装和运行双系统上的应用程序或软件. 使用双配置时,要先安装Windows 7,然后再安装Linux.许多Linux发行版能够识别Windows设备,由此你可以决定是否使用双配置还是仅Linux配置. Ubuntu和Ubuntu的衍生版,如