如何检测TWebBrowser中的导航而不是单击URL?

时间:2013-07-30 12:55:30

标签: delphi twebbrowser

我正在使用TWebBrowser来显示一些HTML内容(本地)。应用程序分为两半,上半部分有5个选项卡,下半部分是Web浏览器。浏览器的内容经常更改,例如更改为其他选项卡时。

显示的内容包括我需要阻止和停止每次点击的网址。我正在尝试使用事件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;

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

1 个答案:

答案 0 :(得分: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的那部分是可怕的。