TEdgeBrowser-OnNewWindowRequsted-在另一个TEdgeBrowser中打开新窗口

ruyhziif  于 2022-10-16  发布在  其他
关注(0)|答案(3)|浏览(211)

Delphi 10.4.2
我是第一次使用TEdgeBrowser,并在我创建的一个小演示应用程序中尝试了一些想法。到目前为止,我已经能够以编程方式导航到网站,登录(填写用户名和密码并单击登录按钮),单击按钮(我的案例)转到另一个页面,然后填写编辑字段和组合框以查找特定案例。到目前为止一切都很好。现在案例已可用,我可以选择点击“历史记录”或“服务信息”。我单击了“History”按钮,希望在另一个TEdgeBrowser组件中打开新窗口。以下是我尝试执行此操作的代码,但它不起作用。

procedure TfrmMain.EdgeBrowserNewWindowRequested(Sender: TCustomEdgeBrowser;
  Args: TNewWindowRequestedEventArgs);
begin
  //* Natigate to the history page
  pgeMain.ActivePage := tabHistory;

  //* Open link in another WebView2 (new tab):
  Args.ArgsInterface.Set_NewWindow(EdgeBrowserHistory.DefaultInterface);
end;

请注意,我在FormShow事件中有以下内容。

procedure TfrmMain.FormShow(Sender: TObject);
begin
  EdgeBrowser.UserDataFolder := 'C:\Temp\';

  EdgeBrowserHistory.CreateWebView;
end;

注意:我的主浏览器是Call EdgeBrowser

procedure TfrmMain.btnGoClick(Sender: TObject);
begin
  pgeMain.ActivePage := tabBrowser;
  EdgeBrowser.Navigate(edtWebSiteURL.Text);
end;

看了这个网站上的其他帖子,我想可能是因为在TPageControl的另一个页面上有一个TEdgeBrowser,所以我把它移到了主窗体上,但它仍然不起作用。
如果我在EdgeBrowserNewWindowRequest事件中没有任何代码,它将打开一个新窗口。有人知道我需要做什么才能让它工作吗?

t5zmwmid

t5zmwmid1#

您只需要将第二个TEdgeBrowser导航到您希望它转到的URL。(还要注意,当您使用args接口获取PWideChar时,需要对CoTaskMemFree进行匹配调用)。而且,假设您可能有其他“标签”或任何其他可能触发NewWindowRequest的按钮/链接,您可能需要一些逻辑来处理这些其他情况,因为下面的代码将转到AnyNewWindowRequest的历史选项卡。我不确定您是否也需要设置EdgeBrowserHistory.UserDataFolder,或者它是否将默认设置为与第一个相同。
试着这样做:

procedure TfrmMain.EdgeBrowserNewWindowRequested(Sender: TCustomEdgeBrowser; Args: TNewWindowRequestedEventArgs);
var
  PUri: PWideChar;
  Url: string;
begin
  //* Navigate to the history page
  pgeMain.ActivePage := tabHistory;

  //* Open link in another WebView2 (new tab):
  Args.ArgsInterface.Get_uri(PUri);
  Url := PUri;
  CoTaskMemFree(PUri);
  EdgeBrowserHistory.Navigate(Url);
  Args.ArgsInterface.Set_Handled(1);
end;
zc0qhyus

zc0qhyus2#

问候格雷格,
感谢您的回复。我确实试着按照您昨天的建议去做,同时尝试做我能想到的任何事情来使它工作,但是,因为我必须登录到这个站点,它不喜欢尝试使用导航()来访问这个页面。
在这里您可以看到左侧的主TEdgeBrowser和右侧的第二个TEdgeBrowser。是的,这一次它确实用一些东西(警告消息)填充了它。关于让它在另一个EdgeBrowser上运行,还有什么其他想法吗?

如果我们不能让它在另一个EdgeBrowser中工作(这是首选方法),我可以使用以下代码在当前EdgeBrowser中显示页面:

procedure TfrmMain.EdgeBrowserNewWindowRequested(Sender: TCustomEdgeBrowser;
  Args: TNewWindowRequestedEventArgs);
begin
  //* Open link in current WebView2:
  Args.ArgsInterface.Set_NewWindow(Sender.DefaultInterface);
end;

虽然可以在Current EdgeBrower中打开历史记录,但现在有了另一个问题,后退按钮被禁用,如果后退按钮被禁用,我无法返回到上一页并点击“服务信息”按钮。
如果我使用MS Edge转到这个网站,查找案例并点击“历史记录”按钮,网站将在一个新的选项卡中打开页面,如果我回到主选项卡,当然后退按钮在那里是禁用的,所以我看不到任何关于这个问题的东西,除非你知道有一个。
所以只剩下一个选项,我真的不太在意,那就是让EdgeBrower做它自己的事情,并在一个新窗口中打开历史记录。这就提出了它自己的一系列问题。
1.新窗口的大小可以控制吗?
1.新窗口的位置可以控制吗?
1.如果我关闭表单,两个新窗口(历史记录和服务信息)将保持打开状态。这真是不太好。
所以底线是,如果这是我唯一的选择,我真的需要能够控制这些窗口。如果可能的话,你有什么想法吗?
再次感谢您所能提供的任何帮助。

4dc9hkyq

4dc9hkyq3#

第一种方法已经是正确的:

Args.ArgsInterface.Set_NewWindow(EdgeBrowserHistory.DefaultInterface);

重要的是,新浏览器已预先初始化。所以,提前给任何一个使用EdgeBrowserHistory.Navigate的网站打电话。那它就起作用了。

相关问题