TLa*_*ama 4 delphi url redirect iwebbrowser2 twebbrowser
例:
http://www.stackoverflow.com使用我的Web浏览器控件导航到https://stackoverflow.com/faqhttp://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, Flags, TargetFrameName, PostData, Headers);
end;
end;
Run Code Online (Sandbox Code Playgroud)
还有另一种更复杂的方法如何实现同样的目标.这是关于使用IDocHostUIHandler界面.除了控制菜单和工具栏的可见性,上下文菜单配置和它提供的一些事件,比如重定向功能.
更具体地说,这是IDocHostUIHandler.TranslateUrl方法.此方法使主机能够修改要加载的URL.如果需要,它会公开Web浏览器控件将要导航的输入URL以及您重定向的输出URL.
以下示例显示了该IDocHostUIHandler.TranslateUrl方法的实现.请注意,我使用了插入的类,因此如果您将此代码放入您的单元中,则只有表单上的那些Web浏览器或在此单元中动态创建的那些Web浏览器才会出现此行为.
如果您单击Button1,您将被导航到该http://www.stackoverflow.com按钮,如果您点击指向您的FAQ链接,https://stackoverflow.com/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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4146 次 |
| 最近记录: |