例子:如何將TWebBrowser控件重定向到自定義URL?
- 我瀏覽到
http://www.stackoverflow.com
使用網絡瀏覽器控制 - 有一個鏈接到最上面一欄常見問題,與目標
https://stackoverflow.com/faq
- 我需要重定向例如到
http://math.stackexchange.com
當我點擊FAQ鏈接
例子:如何將TWebBrowser控件重定向到自定義URL?
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, Flags, TargetFrameName, PostData, 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.
+1。順便說一句,沒有必要重新宣佈TWebBrowser。只需使用document.SetUIHandler和一個新的IDocHostUIHandler實例即可。重定向也可以簡單地完成:'OnBeforeNavigate2' – kobik 2011-12-20 18:58:26
@kobik,謝謝。我忘記了'OnBeforeNavigate'並從未聽說過'SetUIHandler',很高興知道它。所以在這種情況下,這個Q&A失去了它的意義,因爲實施這個沉重的重量是相當矯枉過正的,所以刪除... :) – TLama 2011-12-20 19:21:17
不,不要刪除它。它已經在我的最愛了! :) – kobik 2011-12-20 19:24:19
我已經發布這只是爲了分享。它可能是有用的,例如當您在您的應用程序中使用['TWebBrowser'](http://docwiki.embarcadero.com/VCL/en/SHDocVw.TWebBrowser)控件時,您希望將用戶保留在您的門戶網站上,作爲家長控制等。 – TLama 2011-12-20 17:34:18
此網站是用於問答的,不會發布類推。 – 2011-12-20 17:35:39
請把它作爲[問題和答案](http://meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-those-where-i-knew-the-回答之前問);)嘿,這很容易,只是投下來或投票結束,我會從這裏刪除它;) – TLama 2011-12-20 17:39:00