例:
>我使用网络浏览器控件导航到http://www.stackoverflow.com
>顶部栏中有常见问题解答链接,目标为https://stackoverflow.com/faq
>我需要重定向,例如到http://math.stackexchange.com
点击FAQ链接
解决方法
最简单的方法,如
kobik
建议使用
TWebBrowser.OnBeforeNavigate2
事件.这是一个例子.
procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; var URL,Flags,TargetFrameName,PostData,Headers: OleVariant; var Cancel: WordBool); begin if URL = 'https://stackoverflow.com/faq' then begin // setting this flag to True will cancel the current navigation Cancel := True; // changing this declared parameter doesn't affect anything // I've used it just because it's already declared URL := 'http://math.stackexchange.com'; // interrupt all pending navigations and stop dynamic page elements (pDisp as IWebBrowser2).Stop; // and navigate to the target URL (pDisp as IWebBrowser2).Navigate2(URL,Headers); end; end;
还有另一种更复杂的方法如何实现同样的目标.这是关于使用IDocHostUIHandler
界面.除了控制菜单和工具栏的可见性,上下文菜单配置和它提供的一些事件,比如重定向功能.
更具体地说,它是IDocHostUIHandler.TranslateUrl
方法.此方法使主机能够修改要加载的URL.它会公开Web浏览器控件将要导航的输入URL以及您重定向的输出URL(如果需要).
以下示例显示了IDocHostUIHandler.TranslateUrl
方法的实现.请注意,我使用了插入的类,因此如果您将此代码放入您的单元中,则只有表单上的Web浏览器或在此单元中动态创建的那些Web浏览器才会出现此行为.
如果您单击Button1,您将被导航到http://www.stackoverflow.com
,如果您点击指向https://stackoverflow.com/faq
的FAQ链接,您将被重定向到http://math.stackexchange.com
.
unit Unit1; interface uses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,SHDocVw,ActiveX,StdCtrls,OleCtrls; type PDocHostUIInfo = ^TDocHostUIInfo; TDocHostUIInfo = record cbSize: ULONG; dwFlags: DWORD; dwDoubleClick: DWORD; end; // *********************************************************************// // Interface: IDocHostUIHandler // Flags: (0) // GUID: {BD3F23C0-D43E-11CF-893B-00AA00BDCE1A} // *********************************************************************// IDocHostUIHandler = interface(IUnknown) ['{BD3F23C0-D43E-11CF-893B-00AA00BDCE1A}'] function ShowContextMenu(const dwID: DWORD; const ppt: PPoint; const pcmdtReserved: IUnknown; const pdispReserved: IDispatch): HRESULT; stdcall; function GetHostInfo(var pInfo: TDocHostUIInfo): HRESULT; stdcall; function ShowUI(const dwID: DWORD; const pActiveObject: IOleInPlaceActiveObject; const pCommandTarget: IOleCommandTarget; const pFrame: IOleInPlaceFrame; const pDoc: IOleInPlaceUIWindow): HRESULT; stdcall; function HideUI: HRESULT; stdcall; function UpdateUI: HRESULT; stdcall; function EnableModeless(const fEnable: BOOL): HRESULT; stdcall; function OnDocWindowActivate(const fActivate: BOOL): HRESULT; stdcall; function OnFrameWindowActivate(const fActivate: BOOL): HRESULT; stdcall; function ResizeBorder(const prcBorder: PRect; const pUIWindow: IOleInPlaceUIWindow; const fRameWindow: BOOL): HRESULT; stdcall; function TranslateAccelerator(const lpMsg: PMSG; const pguidCmdGroup: PGUID; const nCmdID: DWORD): HRESULT; stdcall; function GetOptionKeyPath(var pchKey: POleStr; const dw: DWORD): HRESULT; stdcall; function GetDropTarget(const pDropTarget: IDropTarget; out ppDropTarget: IDropTarget): HRESULT; stdcall; function GetExternal(out ppDispatch: IDispatch): HRESULT; stdcall; function TranslateUrl(const dwTranslate: DWORD; const pchURLIn: POleStr; var ppchURLOut: POleStr): HRESULT; stdcall; function FilterDataObject(const pDO: IDataObject; out ppDORet: IDataObject): HRESULT; stdcall; end; TWebBrowser = class(SHDocVw.TWebBrowser,IDocHostUIHandler) private function ShowContextMenu(const dwID: DWORD; const ppt: PPoint; const pcmdtReserved: IUnknown; const pdispReserved: IDispatch): HRESULT; stdcall; function GetHostInfo(var pInfo: TDocHostUIInfo): HRESULT; stdcall; function ShowUI(const dwID: DWORD; const pActiveObject: IOleInPlaceActiveObject; const pCommandTarget: IOleCommandTarget; const pFrame: IOleInPlaceFrame; const pDoc: IOleInPlaceUIWindow): HRESULT; stdcall; function HideUI: HRESULT; stdcall; function UpdateUI: HRESULT; stdcall; function EnableModeless(const fEnable: BOOL): HRESULT; stdcall; function OnDocWindowActivate(const fActivate: BOOL): HRESULT; stdcall; function OnFrameWindowActivate(const fActivate: BOOL): HRESULT; stdcall; function ResizeBorder(const prcBorder: PRect; const pUIWindow: IOleInPlaceUIWindow; const fRameWindow: BOOL): HRESULT; stdcall; function TranslateAccelerator(const lpMsg: PMSG; const pguidCmdGroup: PGUID; const nCmdID: DWORD): HRESULT; stdcall; function GetOptionKeyPath(var pchKey: POleStr; const dw: DWORD): HRESULT; stdcall; function GetDropTarget(const pDropTarget: IDropTarget; out ppDropTarget: IDropTarget): HRESULT; stdcall; function GetExternal(out ppDispatch: IDispatch): HRESULT; stdcall; function TranslateUrl(const dwTranslate: DWORD; const pchURLIn: POleStr; var ppchURLOut: POleStr): HRESULT; stdcall; function FilterDataObject(const pDO: IDataObject; out ppDORet: IDataObject): HRESULT; stdcall; end; type TForm1 = class(TForm) Button1: TButton; WebBrowser1: TWebBrowser; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function TWebBrowser.ShowContextMenu(const dwID: DWORD; const ppt: PPoint; const pcmdtReserved: IUnknown; const pdispReserved: IDispatch): HRESULT; begin Result := E_NOTIMPL; end; function TWebBrowser.GetHostInfo(var pInfo: TDocHostUIInfo): HRESULT; begin Result := E_NOTIMPL; end; function TWebBrowser.ShowUI(const dwID: DWORD; const pActiveObject: IOleInPlaceActiveObject; const pCommandTarget: IOleCommandTarget; const pFrame: IOleInPlaceFrame; const pDoc: IOleInPlaceUIWindow): HRESULT; begin Result := E_NOTIMPL; end; function TWebBrowser.HideUI: HRESULT; begin Result := E_NOTIMPL; end; function TWebBrowser.UpdateUI: HRESULT; begin Result := E_NOTIMPL; end; function TWebBrowser.EnableModeless(const fEnable: BOOL): HRESULT; begin Result := E_NOTIMPL; end; function TWebBrowser.OnDocWindowActivate(const fActivate: BOOL): HRESULT; begin Result := E_NOTIMPL; end; function TWebBrowser.OnFrameWindowActivate(const fActivate: BOOL): HRESULT; begin Result := E_NOTIMPL; end; function TWebBrowser.ResizeBorder(const prcBorder: PRect; const pUIWindow: IOleInPlaceUIWindow; const fRameWindow: BOOL): HRESULT; begin Result := E_NOTIMPL; end; function TWebBrowser.TranslateAccelerator(const lpMsg: PMSG; const pguidCmdGroup: PGUID; const nCmdID: DWORD): HRESULT; begin Result := E_NOTIMPL; end; function TWebBrowser.GetOptionKeyPath(var pchKey: POleStr; const dw: DWORD): HRESULT; begin Result := E_NOTIMPL; end; function TWebBrowser.GetDropTarget(const pDropTarget: IDropTarget; out ppDropTarget: IDropTarget): HRESULT; begin Result := E_NOTIMPL; end; function TWebBrowser.GetExternal(out ppDispatch: IDispatch): HRESULT; begin Result := E_NOTIMPL; end; function TWebBrowser.TranslateUrl(const dwTranslate: DWORD; const pchURLIn: POleStr; var ppchURLOut: POleStr): HRESULT; begin // pchURLIn is the URL where the browser is going to navigate // ppchURLOut is the URL where the browser will navigate if pchURLIn = 'https://stackoverflow.com/faq' then ppchURLOut := 'http://math.stackexchange.com'; Result := S_OK; end; function TWebBrowser.FilterDataObject(const pDO: IDataObject; out ppDORet: IDataObject): HRESULT; begin Result := E_NOTIMPL; end; procedure TForm1.Button1Click(Sender: TObject); begin WebBrowser1.Navigate('http://www.stackoverflow.com'); end; end.