4

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

显示的内容包括我需要阻止和停止每次点击的 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;

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

4

1 回答 1

4

请注意,以下内容未记录在案。一些people say,它适用于我(在 Windows 7 64 位,使用 Internet Explorer 10)检查参数的神奇常数Flags。如果事件的Flags参数OnBeforeNavigate2等于 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 的那部分很糟糕。

于 2013-07-30T13:20:57.103 回答