C#学习教程:如何在不影响SYSTEM/IE代理的情况下为WebbrowserControl设置代理基本上我希望我的应用程序使用某个代理,但显然我不想更改用户的IE代理设置。尝试UrlMkSetSessionOptionINTERNET_OPTION_PROXY和UrlMkSetSessionOptionINTERNET_OPTION_REFRESH如果您的代理有密码验证,您可能需要在WebBrowserSiteBase派生类中实现IAuthenticate(Ex)。我在网上看到了一些可怕的解决方案。大多数涉及为整台机器设置代理,然后将其切换回来。这是一个允许您仅为托管控件的进程设置它的类。您可以这样称呼它:WinInetInterop.SetConnectionProxy("localhost:8888");然后使用此调用将其恢复为IE中的默认设置://ReadIE'sdefaultsettingsandrestorethemtoproxyWinInetInterop.RestoreSystemProxy();如果您觉得这有用,请告诉我!清单:使用系统;使用System.Runtime.InteropServices;namespaceSetProxy{publicstaticclassWinInetInterop{publicstaticstringapplicationName;[DllImport("wininet.dll",SetLastError=true,CharSet=CharSet.Auto)]privatestaticexternIntPtrInternetOpen(stringlpszAgent,intdwAccessType,stringlpszProxyName,stringlpszProxyBypass,intdwFlags);[DllImport("wininet.dll",SetLastError=true)][返回:MarshalAs(UnmanagedType.Bool)]privatestaticexternboolInternetCloseHandle(IntPtrhInternet);[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]privatestructINTERNET_PER_CONN_OPTION_LIST{publicintSize;//要设置的连接。NULL表示局域网。公共System.IntPtr连接;公共intOptionCount;公共诠释选项错误;//INTERNET_PER_CON列表N_OPTION项。公共System.IntPtrpOptions;}privateenumINTERNET_OPTION{//设置或检索INTERNET_PER_CONN_OPTION_LIST结构,该结构指定//特定连接的选项列表。INTERNET_OPTION_PER_CONNECTION_OPTION=75,//通知系统注册表设置已更改,以便//在下次调用InternetConnect时验证设置。INTERNET_OPTION_SETTINGS_CHANGED=39,//导致从注册表重新读取代理数据以获得句柄。INTERNET_OPTION_REFRESH=37}privateenumINTERNET_PER_CONN_OptionEnum{INTERNET_PER_CONN_FLAGS=1,INTERNET_PER_CONN_PROXY_SERVER=2,INTERNET_PER_CONN_PROXY_BYPASS=3,INTERNET_PER_CONN_AUTOCONFIG_URL=4,INTERNET_PER_CONN_AUTODISCOVERY_FLAGS=5,INTERNET_PER_CONN_AUTOCONFIG_SECONDARY_URL=6,INTERNET_PER_CONN_AUTOCONFIG_RELOAD_DELAY_MINS=7,INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_TIME=8,INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_URL=9,INTERNET_PER_CONN_FLAGS_UI=10}privateconstintINTERNET_OPEN_TYPE_DIRECT=1;//直接到网络privateconstintINTERNET_OPEN_TYPE_PRECONFIG=0;//读取注册表//////INTERNET_PER_CONN_OPTON结构中使用的常量。///privateenumINTERNET_OPTION_PER_CONN_FLAGS{PROXY_TYPE_DIRECT=0x00000001,//directtonetPROXY_TYPE_PROXY=0x00000002,//通过命名代理PROXY_TYPE_AUTO_PROXY_URL=0x00000004,//autoproxyURLPROXY_TYPE_AUTO_800在检测中使用////proxy00使用///0x0xINTERNET_PER_CONN_OPTION。///当创建OptionUnion实例时,只会使用一个字段。///StructLayout和FieldOffset属性可以帮助减小结构大小。///[StructLayout(LayoutKind.Explicit)]privatestructINTERNET_PER_CONN_OPTION_OptionUnion{//INTERNET_OPTION_PER_CONN_FLAGS中的值。[FieldOffset(0)]publicintdwValue;[FieldOffset(0)]publicSystem.IntPtrpszValue;[FieldOffset(0)]publicSystem.Runtime.InteropServices.ComTypes.FILETIMEftValue;}[StructLayout(LayoutKind.Sequential)]privatestructINTERNET_PER_CONN_OPTION{//INTERNET_PER_CONN_OptionEnum中的值。公共intdwOption;公共INTERNET_PER_CONN_OPTION_OptionUnion值;}//////设置Internet选项。///[DllImport("wininet.dll",CharSet=CharSet.Ansi,SetLastError=true)]privatestaticexternboolInternetSetOption(IntPtrhInternet,INTERNET_OPTIONdwOption,IntPtrlpBuffer,intlpdwBufferLength);//////查询指定句柄上的Internet选项。句柄将始终为0。///[DllImport("wininet.dll",CharSet=CharSet.Ansi,SetLastError=true,EntryPoint="InternetQueryOption")]privateexternstaticboolInternetQueryOptionList(IntPtrHandle,INTERNET_OPTIONOptionFlag,refINTERNET_PER_CONN_OPTION_LIST选项列表,参考整数大小);//////设置局域网连接的代理服务器。///publicstaticboolSetConnectionProxy(stringproxyServer){IntPtrhInternet=InternetOpen(applicationName,INTERNET_OPEN_TYPE_DIRECT,null,null,0);////创建3个选项。//INTERNET_PER_CONN_OPTION[]Options=newINTERNET_PER_CONN_OPTION[3];//创建2个选项。INTERNET_PER_CONN_OPTION[]选项=newINTERNET_PER_CONN_OPTION[2];//设置代理标志。选项[0]=新的INTERNET_PER_CONN_OPTION();选项[0].dwOption=(int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_FLAGS;选项[0].Value.dwValue=(int)INTERNET_OPTION_PER_CONN_FLAGS.PROXY_TYPE_PROXY;//设置代理名称。选项[1]=新的INTERNET_PER_CONN_OPTION();选项[1].dwOption=(int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_SERVER;Options[1].Value.pszValue=Marshal.StringToHGlobalAnsi(proxyServer);////设置代理绕过。//选项[2]=newINTERNET_PER_CONN_OPTION();//Options[2].dwOption=//(int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_BYPASS;//Options[2].Value.pszValue=Marshal.StringToHGlobalAnsi("local");////分配选项的内存块。//System.IntPtrbuffer=Marshal.AllocCoTaskMem(Marshal.SizeOf(Options[0])//+Marshal.SizeOf(Options[1])+Marshal.SizeOf(Options[2]));//分配选项的内存块。System.IntPtrbuffer=Marshal.AllocCoTaskMem(Marshal.SizeOf(Options[0])+Marshal.SizeOf(Options[1]));System.IntPtr当前=缓冲区;//将托管对象中的数据编组到非托管内存块。for(inti=0;i///备份LAN连接的当前选项。///确保在恢复后释放内存。///privatestaticINTERNET_PER_CONN_OPTION_LISTGetSystemProxy(){//查询以下选项。INTERNET_PER_CONN_OPTION[]Options=新的INTERNET_PER_CONN_OPTION[3];选项[0]=新的INTERNET_PER_CONN_OPTION();选项[0].dwOption=(int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_FLAGS;选项[1]=新的INTERNET_PER_CONN_OPTION();选项[1].dwOption=(int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_SERVER;选项[2]=新的INTERNET_PER_CONN_OPTION();选项[2].dwOption=(int)INTERNET_PER_CONN_OptionEnum.INTERNET_PER_CONN_PROXY_BYPASS;//分配选项的内存块。System.IntPtrbuffer=Marshal.AllocCoTaskMem(Marshal.SizeOf(Options[0])+Marshal.SizeOf(Options[1])+Marshal.SizeOf(Options[2]));System.IntPtrcurrent=(System.IntPtr)buffer;//将托管对象中的数据编组到非托管内存块。for(inti=0;i///恢复LAN连接的选项。/////////publicstaticboolRestoreSystemProxy(){IntPtrhInternet=InternetOpen(applicationName,INTERNET_OPEN_TYPE_DIRECT,null,null,0);INTERNET_PER_CONN_OPTION_LISTrequest=GetSystemProxy();intsize=Marshal.SizeOf(request);//分配内存IntPtrintptrStruct=Marshal.AllocCoTaskMem(size);//将结构转换为IntPtrMarshal.StructureToPtr(request,intptrStruct,true);//设置互联网选项。boolbReturn=InternetSetOption(hInternet,INTERNET_OPTION.INTERNET_OPTION_PER_CONNECTION_OPTION,intptrStruct,大小);//释放分配的内存。Marshal.FreeCoTaskMem(request.pOptions);Marshal.FreeCoTaskMem(intptrStruct);if(!bReturn){thrownewApplicationException("设置Internet选项失败!");}//通知系统注册表设置已更改并导致//从注册表重新读取代理数据以获得句柄。InternetSetOption(hInternet,INTERNET_OPTION.INTERNET_OPTION_SETTINGS_CHANGED,IntPtr.Zero,0);InternetSetOption(hInternet,INTERNET_OPTION.INTERNET_OPTION_REFRESH,IntPtr.Zero,0);互联网关闭句柄(hInternet);返回b返回;}}}http://blogs.msdn.com/b/jpsanders/archive/2011/04/26/how-to-set-the-proxy-for-the-webbrowser-control-in-net.aspx公共结构Struct_INTERNET_PROXY_INFO{publicintdwAccessType;公共IntPtr代理;公共IntPtrproxyBypass;};[DllImport("wininet.dll",SetLastError=true)]publicstaticexternboolInternetSetOption(IntPtrhInternet,intdwOption,IntPtrlpBuffer,intlpdwBufferLength);//像这样激活使用strProxy="85.45.66.25:3633"//像这样禁用使用strProxy=":"publicstaticvoidRefreshIESettings(stringstrProxy){try{constintINTERNET_OPTION_PROXY=38;constintINTERNET_OPEN_TYPE_PROXY=3;结构_INTERNET_PROXY_INFOstruct_IPI;//填充结构struct_IPI.dwAccessType=INTERNET_OPEN_TYPE_PROXY;struct_IPI.proxy=Marshal.StringToHGlobalAnsi(strProxy);struct_IPI.proxyBypass=Marshal.StringToHGlobalAnsi("local");//分配内存IntPtrintptrStruct=Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI));//将结构转换为IntPtrMarshal.StructureToPtr(struct_IPI,intptrStruct,true);booliReturn=InternetSetOption(IntPtr.Zero,INTERNET_OPTION_PROXY,intptrStruct,Marshal.SizeOf(struct_IPI));}catch(Exceptionex){//TB.ErrorLog(ex);}}[1]https://social.msdn.microsoft.com/Forums/fr-FR/f4dc3550-f213-41ff-a17d-95c917bed027/webbrowser-control-for-setting-proxy?forum=winformsWebBrowser控件不能是IE。就是下面的IE渲染引擎。基本上IE.exe就像围绕它的UI。以上是C#学习教程:如何在不影响SYSTEM/IE代理的情况下为WebbrowserControl设置代理。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络收藏不代表立场,如涉及侵权,请点右转联系管理员删除。如需转载请注明出处:
