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