【问题标题】:How to detect navigation in TWebBrowser as opposed to clicking URLs?如何检测 TWebBrowser 中的导航而不是单击 URL?
【发布时间】:2013-07-30 12:55:30
【问题描述】:

我正在使用TWebBrowser 显示一些 HTML 内容(本地)。该应用程序分为两半,上半部分有 5 个选项卡,下半部分是 Web 浏览器。浏览器的内容经常变化,例如在切换到不同的选项卡时。​​p>

显示的内容包括我需要阻止和停止每次点击的 URL。我正在尝试使用事件OnBeforeNavigate2,它确实检测到每个点击的链接,但也检测到我何时以编程方式调用Navigate。所以,它最终永远不会导航到任何地方。

我尝试包装 Navigate 调用,所以我总是调用类似...

procedure TForm1.Nav(const S: String);
begin
  FLoading:= True;
  try
    Web.Navigate(S);
    Sleep(50);
  finally
    FLoading:= False;
  end;
end;

(睡眠只是为了给它一秒钟的等待时间)

然后捕获呼叫...

procedure TForm1.WebBeforeNavigate2(ASender: TObject; const pDisp: IDispatch;
  const URL, Flags, TargetFrameName, PostData, Headers: OleVariant;
  var Cancel: WordBool);
begin
  if not FLoading then
    Cancel:= True;
end;

没有运气尝试这个技巧。如何检测页面或用户何时导航,而不是何时指示浏览器导航?

【问题讨论】:

  • 虽然 TLama 很好地回答了这个问题,但我想我会指出我的下一个解决方案会很草率:每当我调用 TWebBrowser.Navigate() 时,请包含一个虚拟查询字符串,例如 &bypass=Y 并进行搜索对于OnBeforeNavigate2 事件中的该查询参数。

标签: delphi twebbrowser


【解决方案1】:

请注意,以下内容未记录在案。一些people say,它适用于我(在Windows 7 64 位,使用Internet Explorer 10)检查Flags 参数的一个神奇的常量。如果OnBeforeNavigate2 事件的Flags 参数等于64,那么是用户在链接中导航。如果Flags 参数等于0,则调用导航的是IWebBrowser2::Navigate 方法。在代码中是:

procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject;
  const pDisp: IDispatch; const URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
begin
  if (Flags and navHyperlink) = navHyperlink then
    ShowMessage('User clicked a link...')
  else
    ShowMessage('IWebBrowser2::Navigate has been invoked...');
end;

如果这只是无意中未记录的标志值,我不会感到惊讶,因为 MSDN 的那部分内容很糟糕。

【讨论】:

  • 这让我觉得这是导航事件传递的navHyperlink标志值...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2014-03-13
  • 1970-01-01
相关资源
最近更新 更多