Пример #1
0
        /// <summary>
        /// 备份当前局域网连接的设置,确认恢复后内存被释放。
        /// </summary>
        public static INTERNET_PER_CONN_OPTION_LIST BackupConnectionProxy()
        {
            // 查询以下选项。
            INTERNET_PER_CONN_OPTION[] Options = new INTERNET_PER_CONN_OPTION[3];

            Options[0] = new INTERNET_PER_CONN_OPTION();
            Options[0].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_FLAGS;
            Options[1] = new INTERNET_PER_CONN_OPTION();
            Options[1].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_SERVER;
            Options[2] = new INTERNET_PER_CONN_OPTION();
            Options[2].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_BYPASS;

            // 为选项申请内存。
            System.IntPtr buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(Options[0])
                + Marshal.SizeOf(Options[1]) + Marshal.SizeOf(Options[2]));

            System.IntPtr current = (System.IntPtr)buffer;

            // 将数据从一个受管理的类移到不受管理的内存中。
            for (int i = 0; i < Options.Length; i++)
            {
                Marshal.StructureToPtr(Options[i], current, false);
                current = (System.IntPtr)((int)current + Marshal.SizeOf(Options[i]));
            }

            // 初始化INTERNET_PER_CONN_OPTION_LIST数据结构的实体。
            INTERNET_PER_CONN_OPTION_LIST Request = new INTERNET_PER_CONN_OPTION_LIST();

            // 定义指向被申请的内存的指针。
            Request.pOptions = buffer;

            Request.Size = Marshal.SizeOf(Request);

            // IntPtr为0表示局域网连接。
            Request.Connection = IntPtr.Zero;

            Request.OptionCount = Options.Length;
            Request.OptionError = 0;
            int size = Marshal.SizeOf(Request);

            // 查询internet设置。
            bool result = InternetQueryOptionList(IntPtr.Zero,
                INTERNET_OPTION.INTERNET_OPTION_PER_CONNECTION_OPTION,
                ref Request, ref size);
            if (!result)
            {
                throw new ApplicationException(" Set Internet Option Failed! ");
            }

            return Request;
        }
Пример #2
0
        /// <summary>
        /// 使局域网的代理连接失效。
        /// </summary>
        /// <returns></returns>
        public static bool DisableConnectionProxy()
        {
            // 通过直接连接internet来建立连接。
            INTERNET_PER_CONN_OPTION[] Options = new INTERNET_PER_CONN_OPTION[1];
            Options[0].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_FLAGS;
            Options[0].Value.dwValue = (int)INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_DIRECT;

            // 将数据从一个受管理的类移到不受管理的内存中。
            System.IntPtr buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(Options[0]));
            Marshal.StructureToPtr(Options[0], buffer, false);

            // 初始化INTERNET_PER_CONN_OPTION_LIST数据结构的实体。
            INTERNET_PER_CONN_OPTION_LIST request = new INTERNET_PER_CONN_OPTION_LIST();

            // 定义指向被申请的内存的指针。
            request.pOptions = buffer;

            request.Size = Marshal.SizeOf(request);

            // IntPtr为0表示局域网连接。
            request.Connection = IntPtr.Zero;
            request.OptionCount = Options.Length;
            request.OptionError = 0;
            int size = Marshal.SizeOf(request);

            // 为INTERNET_PER_CONN_OPTION_LIST实体申请内存。
            IntPtr intptrStruct = Marshal.AllocCoTaskMem(size);

            // 将数据从一个受管理的类移到不受管理的内存中。
            Marshal.StructureToPtr(request, intptrStruct, true);

            // 设定internet选项。
            bool bReturn = InternetSetOption(IntPtr.Zero,
            INTERNET_OPTION.INTERNET_OPTION_PER_CONNECTION_OPTION, intptrStruct, size);

            // 释放内存
            Marshal.FreeCoTaskMem(buffer);
            Marshal.FreeCoTaskMem(intptrStruct);

            // 当这个操作失败时抛出异常。
            if (!bReturn)
            {
                throw new ApplicationException(" Set Internet Option Failed! ");
            }

            // 通知系统注册值的改变,以便注册中的句柄能使用这些设定重读代理数据。
            InternetSetOption(IntPtr.Zero, INTERNET_OPTION.INTERNET_OPTION_SETTINGS_CHANGED,
                IntPtr.Zero, 0);
            InternetSetOption(IntPtr.Zero, INTERNET_OPTION.INTERNET_OPTION_REFRESH,
                IntPtr.Zero, 0);

            return bReturn;
        }
Пример #3
0
        /// <summary>
        /// 为局域网设定代理
        /// </summary>
        public static bool SetConnectionProxy(string proxyServer)
        {
            // 创建3个选项
            INTERNET_PER_CONN_OPTION[] Options = new INTERNET_PER_CONN_OPTION[3];

            // 设置代理标记
            Options[0] = new INTERNET_PER_CONN_OPTION();
            Options[0].dwOption = (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_FLAGS;
            Options[0].Value.dwValue = (int)INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_PROXY;

            // 设置代理名称
            Options[1] = new INTERNET_PER_CONN_OPTION();
            Options[1].dwOption =
                (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_SERVER;
            Options[1].Value.pszValue = Marshal.StringToHGlobalAnsi(proxyServer);

            // 设置代理口令
            Options[2] = new INTERNET_PER_CONN_OPTION();
            Options[2].dwOption =
                (int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_BYPASS;
            Options[2].Value.pszValue = Marshal.StringToHGlobalAnsi("local");

            // 申请内存储存设置
            System.IntPtr buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(Options[0])
                + Marshal.SizeOf(Options[1]) + Marshal.SizeOf(Options[2]));

            System.IntPtr current = buffer;

            // 将数据从类的实体中转存到内存中。
            for (int i = 0; i < Options.Length; i++)
            {
                Marshal.StructureToPtr(Options[i], current, false);
                current = (System.IntPtr)((int)current + Marshal.SizeOf(Options[i]));
            }

            // 初始化INTERNET_PER_CONN_OPTION_LIST数据结构的实体。
            INTERNET_PER_CONN_OPTION_LIST option_list = new INTERNET_PER_CONN_OPTION_LIST();

            // 定义指向被申请的内存的指针。
            option_list.pOptions = buffer;

            // 返回不受管理的实体大小。
            option_list.Size = Marshal.SizeOf(option_list);

            // IntPtr为0表示局域网连接。
            option_list.Connection = IntPtr.Zero;

            option_list.OptionCount = Options.Length;
            option_list.OptionError = 0;
            int size = Marshal.SizeOf(option_list);

            // 为INTERNET_PER_CONN_OPTION_LIST实体申请内存。
            IntPtr intptrStruct = Marshal.AllocCoTaskMem(size);

            // 将数据从一个受管理的类中移到不受管理的内存中去。
            Marshal.StructureToPtr(option_list, intptrStruct, true);

            // 设定internet选项。
            bool bReturn = InternetSetOption(IntPtr.Zero,
                INTERNET_OPTION.INTERNET_OPTION_PER_CONNECTION_OPTION, intptrStruct, size);

            // 释放内存
            Marshal.FreeCoTaskMem(buffer);
            Marshal.FreeCoTaskMem(intptrStruct);

            // 当这个操作失败时抛出异常。
            if (!bReturn)
            {
                throw new ApplicationException(" Set Internet Option Failed!");
            }

            // 通知系统注册值的改变,以便注册中的句柄能使用这些设定重读代理数据。
            InternetSetOption(IntPtr.Zero, INTERNET_OPTION.INTERNET_OPTION_SETTINGS_CHANGED,
                IntPtr.Zero, 0);
            InternetSetOption(IntPtr.Zero, INTERNET_OPTION.INTERNET_OPTION_REFRESH,
                IntPtr.Zero, 0);

            return bReturn;
        }