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

dphi5xsq  于 2022-11-23  发布在  其他
关注(0)|答案(2)|浏览(172)

我正在使用TWebBrowser来显示一些HTML内容(本地)。应用程序被分成两半,上半部分有5个标签,下半部分是Web浏览器。浏览器的内容经常更改,例如当更改到不同的标签时。
显示的内容包括我需要阻止和停止每次点击的URL。我尝试使用事件OnBeforeNavigate2,它检测点击的每个链接,但也检测我何时通过编程调用Navigate。因此,它最终永远不会导航到任何地方。
我试着 Package 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;

尝试这个技巧没有运气。我怎么能检测到页面或用户导航的时间,而不是浏览器被指示导航的时间?

t0ybt7op

t0ybt7op1#

请注意,以下是未记录的。一些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的这一部分是可怕的。

m528fe3b

m528fe3b2#

我用这种方式来获得完整的URL加上哈希标签:

uses Winapi.ShellAPI, UnitFaktorMain, MsHtml;

procedure TfrmIntro.wb1NewWindow3(ASender: TObject; var ppDisp: IDispatch; var Cancel: WordBool; dwFlags: Cardinal; const bstrUrlContext, bstrUrl: WideString);
var
  vAdr     :string;
begin
  Cancel:= True;
  try
    vAdr := ((TWebBrowser(ASender).Document as IHTMLDocument2).ActiveElement as IHTMLElement).GetAttribute('href', 0);
  except
    vAdr:= bstrUrl;
  end;
  ShellExecute(Handle,
               'open',
               PWideChar(vAdr),
               nil,
               nil,
               SW_SHOW);
end;

procedure TForm1.wb2BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; const URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Cancel: WordBool);
begin
  if (Flags and navHyperlink) = navHyperlink then begin
    Cancel:= True;
    ShellExecute(Handle,
               'open',
               PWideChar(VarToStr(URL)),
               nil,
               nil,
               SW_SHOW);
  end;
end;

相关问题