>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WebBrowser、MSHTML在Delphi中的使用
1.初始化和終止化
uses ActiveX;
initialization
OleInitialize(nil);
finalization
try
OleUninitialize;
except
end;
2.EmptyParam
EmptyParam是一個公用的Variant空變量,不要對它賦值
var
t:OleVariant;
begin
webbrowser1.Navigate(edit1.text,t,t,t,t);
{這句可以寫成webbrowser1.Navigate(edit1.text,EmptyParam,EmptyParam,EmptyParam,EmptyParam);}
end;
3.命令操作
常用的命令操作用ExecWB方法即可完成
procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT); overload;
procedure ExecWB(cmdID: OLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant); overload;
procedure ExecWB(cmdID: rOLECMDID; cmdexecopt: OLECMDEXECOPT; var pvaIn: OleVariant; var pvaOut: OleVariant); overload;
打開:CommandID爲OLECMDID_OPEN
另存爲:ExecWB(OLECMDID_SAVEAS,OLECMDEXECOPT_DODEFAULT, EmptyParam, EmptyParam);
打印:ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DODEFAULT, EmptyParam, EmptyParam);
打印預覽:if QueryStatusWB(OLECMDID_PRINTPREVIEW)=3 then ExecWB(OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT, EmptyParam,EmptyParam);
頁面設置:ExecWB(OLECMDID_PAGESETUP, OLECMDEXECOPT_DODEFAULT, EmptyParam, EmptyParam);
剪切:ExecWB(OLECMDID_CUT,OLECMDEXECOPT_DODEFAULT);
複製:ExecWB(OLECMDID_COPY,OLECMDEXECOPT_DODEFAULT);
粘貼:ExecWB(OLECMDID_PASTE,OLECMDEXECOPT_DODEFAULT);
全選:ExecWB(OLECMDID_SELECTALL,OLECMDEXECOPT_DODEFAULT);
A.使用TWebBrowser的QueryStatusWB方法
if(QueryStatusWB(OLECMDID_COPY)=OLECMDF_ENABLED or OLECMDF_SUPPORTED) then
ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT, EmptyParam, EmptyParam);
B.用IHTMLDocument2的QueryCommandEnabled方法
var
Doc: IHTMLDocument2;
begin
Doc :=WebBrowser1.Document as IHTMLDocument2;
if Doc.QueryCommandEnabled('Copy') then
Doc.ExecCommand('Copy',false,EmptyParam);
end;
4.字體大小
類似“字體”菜單上的從“最大”到“最小”五項(對應整數0~4,Largest等假設爲五個菜單項的名字,Tag屬性分別設爲0~4)。
讀取當前頁面字體大小。
var
t: OleVariant;
Begin
WebBrowser1.ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, EmptyParam,t);
case t of
4: Largest.Checked :=true;
3: Larger.Checked :=true;
2: Middle.Checked :=true;
1: Small.Checked :=true;
0: Smallest.Checked :=true;
end;
end;
設置頁面字體大小。
Largest.Checked :=false;
Larger.Checked :=false;
Middle.Checked :=false;
Small.Checked :=false;
Smallest.Checked :=false;
TMenuItem(Sender).Checked :=true;
t :=TMenuItem(Sender).Tag;
WebBrowser1.ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER,t,t);
5.使WebBrowser獲得焦點
uses MSHTML;
方法一:
if WebBrowser1.Document <> nil then
IHTMLWindow2(IHTMLDocument2(WebBrowser1.Document).ParentWindow).focus;
方法二:
procedure TForm1.SetFocusToDoc;
begin
if WebBrowser1.Document <> nil then
with WebBrowser1.Application as IOleobject do
DoVerb(OLEIVERB_UIACTIVATE, nil, WebBrowser1, 0, Handle, GetClientRect);
end;
6.點擊提交按鈕
A.在Delphi 5光盤上的Info\Extras\SendKeys目錄下有一個SndKey32.pas文件,其中包含了兩個函數SendKeys和AppActivate,我們可以用SendKeys函數來向WebBrowser發送回車鍵
Sendkeys('~',true);
B.在OnMessage事件中將接受到的鍵盤消息傳遞給WebBrowser。
procedure TMainForm.ApplicationEvents1Message(var Msg: TagMSG;
var Handled: Boolean);
const
StdKeys = [VK_TAB, VK_RETURN];
ExtKeys = [VK_DELETE, VK_BACK, VK_LEFT, VK_RIGHT];
fExtended = $01000000;
begin
Handled := False;
with Msg do
if ((Message >= WM_KEYFIRST) and (Message <= WM_KEYLAST)) and
((wParam in StdKeys) or (GetKeyState(VK_Control) < 0) or
(wParam in ExtKeys) and ((lParam and fExtended) = fExtended)) then
try
if IsChild((PCT.ActivePage as TTabs).FMIE.handle, hWnd) then
begin
with (PCT.ActivePage as TTabs).FMIE.Application as IOleInPlaceActiveObject do
Handled := (TranslateAccelerator(Msg) = S_OK);
if not Handled then
begin
Handled := True;
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
except
end;
end;
7.直接從TWebBrowser得到網頁源碼及Html
IHtmlDocument2(WebBrowser1.Document).Body.OuterHtml;
8.查找功能
var
Doc: IHtmlDocument2;
TxtRange: IHtmlTxtRange;
begin
Doc :=WebBrowser1.Document as IHtmlDocument2;
webbrowser1.ExecWB(OLECMDID_SELECTALL,OLECMDEXECOPT_DODEFAULT);
TxtRange :=Doc.Selection.CreateRange as IHtmlTxtRange;
TxtRange.findText('Text to be searched',0,0);
TxtRange.Select;
end;
9.提取網頁中所有鏈接
procedure TMainForm.GetLinks;
var
doc: IHTMLDocument2;
all: IHTMLElementCollection;
len, i: Integer;
item: OleVariant;
begin
FormLink.lstLink.Clear;
try
doc := ((PCT.ActivePage as TTabs).FMIE.Document) as IHTMLDocument2;
except
Exit;
end;
all := doc.Links;
len := all.Length;
for i := 0 to len - 1 do begin
item := all.item(i, varempty); //EmpryParam亦可
FormLink.lstLink.Items.Add(item);
end;
FormLink.Show;
end;
10.設置TWebBrowser的編碼
procedure SetCharSet(AWebBrowser: TWebBrowser; ACharSet:String);
var
RefreshLevel: OleVariant;
Begin
IHTMLDocument2(AWebBrowser.Document).Set_CharSet(ACharSet);
RefreshLevel :=7; //這個7應該從註冊表來,幫助有Bug。
AWebBrowser.Refresh2(RefreshLevel);
End;
11.轉入IHTMLDocument接口
uses mshtml;
var doc:IHTMLDocument2;
doc:=webbrowser1.document as IHTMLDocument2;
12.TWebBrowser控件說明
方法:
GoBack 相當於IE的“後退”按鈕,使你在當前歷史列表中後退一項
GoForward 相當於IE的“前進”按鈕,使你在當前歷史列表中前進一項
GoHome 相當於IE的“主頁”按鈕,連接用戶默認的主頁
GoSearch 相當於IE的“搜索”按鈕,連接用戶默認的搜索頁面
Navigate 連接到指定的URL
Refresh 刷新當前頁面
Refresh2 同上,只是可以指定刷新級別,所指定的刷新級別的值來自RefreshConstants枚舉表,該表定義在ExDisp.h中,可以指定的不同值如下:
REFRESH_NORMAL 執行簡單的刷新,不將HTTP pragma: no-cache頭髮送給服務器
REFRESH_IFEXPIRED 只有在網頁過期後才進行簡單的刷新
REFRESH_CONTINUE 僅作內部使用。在MSDN裏寫着DO NOT USE! 請勿使用
REFRESH_COMPLETELY 將包含pragma: no-cache頭的請求發送到服務器
Stop 相當於IE的“停止”按鈕,停止當前頁面及其內容的載入
屬性:
Application 如果該對象有效,則返回掌管WebBrowser控件的應用程序實現的自動化對象(IDispatch)。如果在宿主對象中自動化對象無效,這個程序將返回WebBrowser控件的自動化對象
Parent 返回WebBrowser控件的父自動化對象,通常是一個容器,例如是宿主或IE窗口
Container 返回WebBrowser控件容器的自動化對象。通常該值與Parent屬性返回的值相同
Document 爲活動的文檔返回自動化對象。如果HTML當前正被顯示在WebBrowser中,則Document屬性提供對DHTML Object Model的訪問途徑
TopLevelContainer 返回一個Boolean值,表明IE是否是WebBrowser控件頂層容器,是就返回true
Type 返回已被WebBrowser控件加載的對象的類型。例如:如果加載.doc文件,就會返回Microsoft Word Document
Left 返回或設置WebBrowser控件窗口的內部左邊與容器窗口左邊的距離
Top 返回或設置WebBrowser控件窗口的內部左邊與容器窗口頂邊的距離
Width 返回或設置WebBrowser窗口的寬度,以像素爲單位
Height 返回或設置WebBrowser窗口的高度,以像素爲單位
LocationName 返回一個字符串,該字符串包含着WebBrowser當前顯示的資源的名稱,如果資源是網頁就是網頁的標題;如果是文件或文件夾,就是文件或文件夾的名稱
LocationURL 返回WebBrowser當前正在顯示的資源的URL
Busy 返回一個Boolean值,說明WebBrowser當前是否正在加載URL,如果返回true就可以使用stop方法來撤銷正在執行的訪問操作
事件
BeforeNavigate2 導航發生前激發,刷新時不激發
CommandStateChange 當命令的激活狀態改變時激發。它表明何時激活或關閉Back和Forward菜單項或按鈕
DocumentComplete 當整個文檔完成是激發,刷新頁面不激發
DownloadBegin 當某項下載操作已經開始後激發,刷新也可激發此事件
DownloadComplete 當某項下載操作已經完成後激發,刷新也可激發此事件
NavigateComplete2 導航完成後激發,刷新時不激發
NewWindow2 在創建新窗口以前激發
OnFullScreen 當FullScreen屬性改變時激發。該事件採用VARIENT_BOOL的一個輸入參數來指示IE是全屏顯示方式(VARIENT_TRUE)還是普通顯示方式(VARIENT_FALSE)
OnMenuBar 改變MenuBar的屬性時激發,標示參數是VARIENT_BOOL類型的。VARIANT_TRUE是可見,VARIANT_ FALSE是隱藏
OnQuit 無論是用戶關閉瀏覽器還是開發者調用Quit方法,當IE退出時就會激發
OnStatusBar 與OnMenuBar調用方法相同,標示狀態欄是否可見。
OnToolBar 調用方法同上,標示工具欄是否可見。
OnVisible 控制窗口的可見或隱藏,也使用一個VARIENT_BOOL類型的參數
StatusTextChange 如果要改變狀態欄中的文字,這個事件就會被激發,但它並不理會程序是否有狀態欄
TitleChange 網頁標題有效或改變時激發
MSHTML把HTML頁面中的元素封裝成了IHTMLInputElement、 IHTMLInputButtonElement、IHTMLInputTextElement、IHTMLTextAreaElement、IHTMLTitleElement、IHTMLFormElement等等組件接口。在程序中可以通過MSHTML提供的IHTMLDocument2接口得到整個Document對象,IHTMLElementCollection接口得到所有頁面元素的集合,通過該接口的Item方法可以得到具體的某個組件,然後設置和讀取該組件的屬性值。下面是一些常用功能的事例代碼.
1.打開某個頁面: web.Navigate(ExtractFilePath(Application.ExeName) + 'Template/login.html');
2. 取出頁面中某個HtmlElement的Value屬性值:
function GetValueByElementName(web: TWebBrowser; elementName: string; index: integer): string;
begin
result := (((web.Document as IHTMLDocument2).body.all as
IHTMLElementCollection).item(elementName, index) as IHTMLInputElement ).valueend;
3. 給HtmlElement設置Value屬性
procedure SetValueTextAreaName(web: TWebBrowser; elementName, value: string;index: integer);
begin(((web.Document as IHTMLDocument2).body.all as IHTMLElementCollection).item(elementName, index) as IHTMLTextAreaElement).value := value;
end;
4.判斷頁面執行結果是否成功因爲Web應用中如果出錯的一般是採用錯誤頁面的方式呈現給最終用戶,所以我們也無法抓到Http錯誤,只能通過在webBeforeNavigate2事件中將URL參數記錄到全局變量中, 然後在webDocumentComplete事件中根據URL參數和全局變量中的URL參數來判斷執行結果是否正確.
當然,這樣需要將頁面地址編碼到代碼中,降低了靈活性,但是這也是我能想到的唯一的方法,如果大家有什麼好的方法,請告訴我哦.
5.屏蔽鼠標右鍵和某些快捷鍵本功能需要在webBrowser的窗口中加入ApplicationEvents組件,設置它的OnMessage事件代碼如下即可.
procedure TwebAdapterForm.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
const_KeyPressMask = $80000000;
begin//禁用右鍵
with Msg dobegin if not IsChild(web.Handle, hWnd) then Exit;
Handled := (message = WM_RBUTTONDOWN) or (message = WM_RBUTTONUP) or (message = WM_CONTEXTMENU);
end;
//禁止Ctrl + N//禁止Ctrl + F//禁止Ctrl + A
if Msg.message = WM_KEYDOWN then
begin if ((Msg.lParam and _KeyPressMask) = 0) and (GetKeyState(VK_Control) <0) and ((Msg.wParam = Ord('N')) or (Msg.wParam = Ord('F')) or (Msg.wParam = Ord('A'))) then begin Handled := True;
end;
end;
end;
6. 在頁面關閉的時候,同時關掉包含頁面的VCL Form.(僅限 InternetExplorer 6.0)本功能需要卸載掉Delphi自帶的 WebBrowser組件,安裝ActionX組件(Microsoft Internet Controls V1.1),而且以後的程序只能運行在安裝有Internet Explorer 6.0 的環境下.具體方法如下:在WebBrowser組件的OnWindowClosing事件中,輸入self.close; 代碼即可.如果需要阻止窗口的關閉, 設置CanClose參數的值爲Flase.
7. 如何將頁面中超鏈接新開的頁面窗口包到指定的VCL窗口中.
procedure TForm1.webNewWindow2(Sender: TObject; var ppDisp: IDispatch;var Cancel: WordBool);varform : TForm1;
begin form := TForm1.Create(nil);ppDisp := form.web.DefaultDispatch;form.Show;
end;
8.在WebBrowser加載html頁面完成後,在頁面頂端插入HTML代碼, 下面兩種方式鬥可以.
{1. ----------------------------------------------------------------}
procedure TForm1.Button1Click(Sender: TObject);
var
Range: IHTMLTxtRange;
begin
Range := ((WebBrowser1.Document as IHTMLDocument2).body as
IHTMLBodyElement).createTextRange;
Range.collapse(False);
Range.pasteHTML('<br/><b>Hello!</b>');
end;
{2. ----------------------------------------------------------------}
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
WebDoc: HTMLDocument;
WebBody: HTMLBody;
begin
WebDoc := WebBrowser1.Document as HTMLDocument;
WebBody := WebDoc.body as HTMLBody;
WebBody.insertAdjacentHTML('BeforeEnd', '<h1>Hello World!</h1>');
end;
9.將頁面中顯示的內容全部選中,然後粘貼到Word文檔中.
WebBrowser1.ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT);//全選網頁
WebBrowser1.ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT); //複製網頁
WordDocu.Range.Paste; //word文檔粘貼
WebBrowser1.ExecWB(OLECMDID_UNDO, OLECMDEXECOPT_DODEFAULT); //取消全選
注:WebBrowser的Document屬性值和WordDocument的Document屬性值必須都不爲nil.
10.如何解決網頁不響應回車事件
public
{ Public declarations }
procedure MsgHandle(var Msg :TMsg; var Handled :Boolean);
end;
var
Form1: TForm1;
FOleInPlaceActiveObject :IOleInPlaceActiveObject;
implementation
{$R *.DFM}
procedure TForm1.MsgHandle(var Msg :TMsg; var Handled :Boolean);
var
iOIPAO :IOleInPlaceActiveObject;
Dispatch :IDispatch;
begin
if WebBrowser1 =nil then
begin
Handled :=False;
Exit;
end;
Handled :=(IsDialogMessage(WebBrowser1.Handle, Msg) =True);
if (Handled) and (not WebBrowser1.Busy) then
begin
if FOleInPlaceActiveObject =nil then
begin
Dispatch :=WebBrowser1.Application;
if Dispatch <>nil then
begin
Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO);
if iOIPAO <>nil then
FOleInPlaceActiveObject :=iOIPAO;
end;
end;
end;
if FOleInPlaceActiveObject <>nil then
if ((Msg.message =WM_KEYDOWN) or (Msg.Message =WM_KEYUP)) and ((Msg.wParam =VK_BACK) or (Msg.wParam =VK_LEFT) or (Msg.wParam =VK_RIGHT)) then
else
FOleInPlaceActiveObject.TranslateAccelerator(Msg);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage :=MsgHandle;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FOleInPlaceActiveObject :=nil;
end;
11.如何在WebBrowser中調用當前頁面中的javascript函數SayHello()
WebBrowser1.OleObject.
Document.parentWindow.execScript('SayHello()', 'javascript');
//or
(WebBrowser1.Document as IHTMLDocument2
).parentWindow.execScript('SayHello()', 'javascript')
//or
webrowser1.document.script.SayHello();
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>