gpt4 book ai didi

delphi - 如何设置每个 TWebBrowser 使用独立代理?

转载 作者:行者123 更新时间:2023-12-03 15:02:21 29 4
gpt4 key购买 nike

我找到了各种examples关于如何让 TWebBrowser 使用代理(如 202.8.128.5:8080)。然而,所有这些示例都在全局更改所有正在运行的 TWebBrowser 实例的代理。我有两个实例。如何为每个浏览器设置不同的代理?

最佳答案

这可以使用以下代码来实现(公共(public)代码,不是我的):

{$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, nil, 0);
try // Optionen setzen
Result := InternetSetOption(HInternet,
INTERNET_OPTION_PER_CONNECTION_OPTION, @OptionsList, BufSize);
InternetSetOption(HInternet, INTERNET_OPTION_REFRESH, nil, 0);
finally
InternetCloseHandle(HInternet);
end;
finally
FreeMem(OptionsList.pOptions); // Speicher freigeben
end;
end;
  • 在表单上拖放两个 TWebBrowser 组件和两个 TButton
  • TWebBrowser 组件将具有默认名称 WebBrowser1WebBrowser2
  • 两个TButton 将具有默认名称Button1Button2
  • WinInet 添加到 uses 子句

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;

它的外观如下:

enter image description here

左边是带有代理的 WebBrowser1,右边是带有不同代理的 WebBrowser2 - 两个浏览器都在同一个应用程序中,并且显然它们都可以工作。在应用程序运行时,我还通过常规浏览器 (Chrome) 访问了该地址,它确实显示为使用我的原始连接。

所以,它有效。 WebBrowser 组件正在使用其指定的代理,而我电脑上的浏览器不受影响(不使用任何代理)

刚刚使用 Rad Studio 10.2 Tokyo 对此进行了测试。祝你好运:)

更新

正如评论中所强调的,设置用于导航的代理的方法是使用 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 设置代理。不管怎样,我确信有很多方法可以扩展它,所以发挥你的想象力。

关于delphi - 如何设置每个 TWebBrowser 使用独立代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28717411/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com