PRX 设置IE浏览器代理

在Win32中提供了一种快速设置IE浏览器代理的方式 但这种方式可靠性不高 但一般日常使用基本不会出现故障 只有当IE浏览器代理注册表设置被保护 不可写或者出现了一些系统的故障时 才不用。

而知名的shadowsocks-csharp的代码中则使用了这种方式  那么它的原理相对简单,当代理程式修改了IE的代理设置后调用InternetSetOption告知系统需要 HTTP选项设置被改变;此时操作系统会刷新系统的HTTP设置 

刷新代理设置

        public static bool Update()
        {
            NativeMethods.INTERNET_PROXY_INFO* ipi = (NativeMethods.INTERNET_PROXY_INFO*)Marshal.AllocHGlobal(sizeof(NativeMethods.INTERNET_PROXY_INFO));
            NativeMethods.RtlZeroMemory(ipi, sizeof(NativeMethods.INTERNET_PROXY_INFO));
            bool retval = 
                NativeMethods.InternetSetOption(IntPtr.Zero, NativeMethods.INTERNET_OPTION_PROXY_SETTINGS_CHANGED, IntPtr.Zero, 0) &&
                NativeMethods.InternetSetOption(IntPtr.Zero, NativeMethods.INTERNET_OPTION_SETTINGS_CHANGED, (IntPtr)ipi, sizeof(NativeMethods.INTERNET_PROXY_INFO)) &&
                NativeMethods.InternetSetOption(IntPtr.Zero, NativeMethods.INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
            Marshal.FreeHGlobal((IntPtr)ipi);
            return retval;
        }
在某些情况下在修改代理后直接调用InternetSetOption告知系统“INTERNET_OPTION_PROXY_SETTINGS_CHANGED”、“INTERNET_OPTION_SETTINGS_CHANGED”

选项 不会被正确启用 此时应告知系统“INTERNET_OPTION_REFRESH” 但是你可以组合执行它们

设置代理服务器地址有两种方面 一种为注册表、另一种是通过“INTERNET_OPTION_PROXY”设置,顺带一提InternetSetOption如果指定“hInternet”参数为NULL(IntPtr.Zero)

则代表全局设置或者错误 具体依据InternetSetOption支持全局选项。

API设置代理

        public static bool Proxy(string server)
        {
            NativeMethods.INTERNET_PROXY_INFO* ipi = (NativeMethods.INTERNET_PROXY_INFO*)Marshal.AllocHGlobal(sizeof(NativeMethods.INTERNET_PROXY_INFO));
            ipi->dwAccessType = NativeMethods.INTERNET_OPEN_TYPE_PROXY;
            ipi->proxy = (void*)Marshal.StringToHGlobalAuto(server ?? string.Empty);
            ipi->proxyBypass = (void*)Marshal.StringToHGlobalAuto("local");
            bool retval = NativeMethods.InternetSetOption(IntPtr.Zero, NativeMethods.INTERNET_OPTION_PROXY, (IntPtr)ipi, sizeof(NativeMethods.INTERNET_PROXY_INFO));
            Marshal.FreeHGlobal((IntPtr)ipi->proxy);
            Marshal.FreeHGlobal((IntPtr)ipi->proxyBypass);
            Marshal.FreeHGlobal((IntPtr)ipi);
            return retval;
        }
注册表设置代理

        private static void SetProxy(string server, string pac, bool enable)
        {
            using (RegistryKey registry = InternetPropertyOption.Configuration)
            {
                RegistrySetValue(registry, "ProxyServer", server);
                RegistrySetValue(registry, "ProxyEnable", (enable ? 1 : 0));
                RegistrySetValue(registry, "AutoConfigURL", pac);
                InternetPropertyOption.Proxy(server);
                RegistrySetValue(registry, "ProxyOverride", "localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;172.32.*;192.168.*;<local>");
                InternetPropertyOption.Update();
                if (!Regex.IsMatch(RegistryGetValue<string>(registry, "ProxyServer") ?? string.Empty, server))
                {
                    RegistrySetValue(registry, "ProxyServer", server);
                    RegistrySetValue(registry, "ProxyEnable", (enable ? 1 : 0));
                    RegistrySetValue(registry, "AutoConfigURL", pac);
                    InternetPropertyOption.Proxy(server);
                    RegistrySetValue(registry, "ProxyOverride", "localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;172.32.*;192.168.*;<local>");
                    // control.exe inetcpl.cpl
                    Process.Start("rundll32", "shell32.dll,Control_RunDLL inetcpl.cpl");
                }
            }
        }
本文提供的完整参考代码:https://pan.baidu.com/s/1pKOy1Px

猜你喜欢

转载自blog.csdn.net/liulilittle/article/details/78022286