delphi – 如何设置每个TWebBrowser使用独立代理?
我找到了各种关于如何让TWebBrowser使用代理的
examples(如202.8.128.5:8080).
但是,所有这些示例都是为所有正在运行的TWebBrowser实例全局更改代理.我有两个例子.如何为每个浏览器设置不同的代理? 解决方法
这可以使用以下代码(公共代码,而不是我的代码)来实现:
{$DEFINE DELPHI2009_UP} function SetProxy(Server: String): Boolean; // Server z.B. '127.0.0.1:8080' oder '' type INTERNET_PER_CONN_OPTION = record dwOption: DWORD; Value: record case Integer of 1: (dwValue: DWORD); 2: (pszValue: {$IFDEF DELPHI2009_UP}PWideChar{$ELSE}PAnsiChar{$ENDIF}); 3: (ftValue: TFileTime); end; end; LPINTERNET_PER_CONN_OPTION = ^INTERNET_PER_CONN_OPTION; INTERNET_PER_CONN_OPTION_LIST = record dwSize: DWORD; pszConnection: LPTSTR; dwOptionCount: DWORD; dwOptionError: DWORD; pOptions: LPINTERNET_PER_CONN_OPTION; end; LPINTERNET_PER_CONN_OPTION_LIST = ^INTERNET_PER_CONN_OPTION_LIST; const 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; PROXY_TYPE_DIRECT = $00000001; PROXY_TYPE_PROXY = $00000002; PROXY_TYPE_AUTO_PROXY_URL = $00000004; PROXY_TYPE_AUTO_DETECT = $00000008; INTERNET_OPTION_REFRESH = 37; INTERNET_OPTION_PER_CONNECTION_OPTION = 75; INTERNET_OPTION_SETTINGS_CHANGED = 39; var OptionsList: INTERNET_PER_CONN_OPTION_LIST; BufSize: DWORD; HInternet: Pointer; Agent: String; begin Result := False; BufSize := SizeOf(OptionsList); OptionsList.dwSize := BufSize; OptionsList.pszConnection := nil; // nil -> LAN,sonst Verbindungsname OptionsList.dwOptionCount := 3; // 3 Optionen werden gesetzt OptionsList.pOptions := AllocMem(3 * SizeOf(INTERNET_PER_CONN_OPTION)); try if not Assigned(OptionsList.pOptions) then EXIT; OptionsList.pOptions^.dwOption := INTERNET_PER_CONN_FLAGS; OptionsList.pOptions^.Value.dwValue := PROXY_TYPE_DIRECT or PROXY_TYPE_PROXY; inc(OptionsList.pOptions); OptionsList.pOptions^.dwOption := INTERNET_PER_CONN_PROXY_SERVER; OptionsList.pOptions^.Value.pszValue := PChar(Server); inc(OptionsList.pOptions); OptionsList.pOptions^.dwOption := INTERNET_PER_CONN_PROXY_BYPASS; OptionsList.pOptions^.Value.pszValue := 'local'; dec(OptionsList.pOptions,2); Agent := ExtractFileName(Application.ExeName); HInternet := InternetOpen ({$IFDEF DELPHI2009_UP}PWideChar{$ELSE}PAnsiChar{$ENDIF} (Agent),INTERNET_OPEN_TYPE_DIRECT,nil,0); try // Optionen setzen Result := InternetSetOption(HInternet,INTERNET_OPTION_PER_CONNECTION_OPTION,@OptionsList,BufSize); InternetSetOption(HInternet,INTERNET_OPTION_REFRESH,0); finally InternetCloseHandle(HInternet); end; finally FreeMem(OptionsList.pOptions); // Speicher freigeben end; end; >在表单上删除两个TWebBrowser组件和两个TButton 在Button1中调用上面的函数 Button1 OnClick事件的代码: procedure TForm1.Button1Click(Sender: TObject); begin SetProxy('ip:port'); WebBrowser1.Navigate('www.whatismyipaddress.com'); end; Button2 OnClick事件的代码: procedure TForm1.Button2Click(Sender: TObject); begin SetProxy('ip:port'); WebBrowser2.Navigate('www.whatismyipaddress.com'); end; 以下是它的外观: 左边是带有代理的WebBrowser1,右边是带有不同代理的WebBrowser2 – 两个浏览器都在同一个应用程序中,显然它们都有效.我还在应用程序运行时从我的常规浏览器(Chrome)访问了该地址,它确实显示为使用我的原始连接. 所以,它的工作原理. WebBrowser组件正在使用其分配的代理,而我的电脑上的浏览器不受影响(未使用任何一个代理) 刚刚使用Rad Studio 10.2 Tokyo对此进行了测试. UPDATE 正如注释中所强调的那样,设置将用于导航的代理,而不是在设计时或用于导航的按钮中设置代理的方法是使用TStringList并从文件中加载它(例如.txt. ).这可以在TWebBrowser OnBeforeNavigate2事件中使用. procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; var URL,Flags,TargetFrameName,PostData,Headers: OleVariant; var Cancel: WordBool); var proxylist: TStringList; begin proxylist:= TStringList.Create; proxylist.LoadFromFile('proxylist.txt'); SetProxy(proxylist.Strings[0]); //adds the proxy from the 1st line in the txt proxylist.Free; end; 在应用程序文件夹中创建一个名为proxylist的.txt文件,并在那里编写代理. 现在,在开始导航之前,您将拥有TWebBrowser的代理集.无论哪种方式,我相信有很多方法可以扩展它,所以要运用你的想象力. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |