欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PRX 设置IE浏览器代理

程序员文章站 2023-12-30 19:00:40
...

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

而知名的*-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

上一篇:

下一篇: