📄 浏览器.txt
字号:
end;
end;
--------------------------------------------------------------------------
------------------------------
6、使WebBrowser获得焦点
TWebBrowser非常特殊,它从TWinControl继承来的SetFocus方法并不能使得它所
包含的文档获得焦点,从而不能立即使用Internet Explorer本身具有得快捷键,解
决方法如下:<
procedure TForm1.SetFocusToDoc;
begin
if WebBrowser1.Document <> nil then
with WebBrowser1.Application as IOleobject do
DoVerb(OLEIVERB_UIACTIVATE, nil, WebBrowser1, 0, Handle,
GetClientRect);
end;
除此之外,我还找到一种更简单的方法,这里一并列出:
if WebBrowser1.Document <> nil then
IHTMLWindow2(IHTMLDocument2(WebBrowser1.Document).ParentWindow).focus
刚找到了更简单的方法,也许是最简单的:
if WebBrowser1.Document <> nil then
IHTMLWindow4(WebBrowser1.Document).focus
还有,需要判断文档是否获得焦点这样来做:
if IHTMLWindow4(WebBrowser1.Document).hasfocus then
--------------------------------------------------------------------------
------------------------------
7、点击“提交”按钮
如同程序里每个窗体上有一个“缺省”按钮一样,Web页面上的每个Form也有一
个“缺省”按钮——即属性为“Submit”的按钮,当用户按下回车键时就相当于鼠标
单击了“Submit”。但是TWebBrowser似乎并不响应回车键,并且,即使把包含
TWebBrowser的窗体的KeyPreview设为True,在窗体的KeyPress事件里还是不能截获
用户向TWebBrowser发出的按键。
我的解决办法是用ApplicatinEvents构件或者自己编写TApplication对象的
OnMessage事件,在其中判断消息类型,对键盘消息做出响应。至于点击“提交”按
钮,可以通过分析网页源代码的方法来实现,不过我找到了更为简单快捷的方法,有
两种,第一种是我自己想出来的,另一种是别人写的代码,这里都提供给大家,以做
参考。
A、用SendKeys函数向WebBrowser发送回车键
在Delphi 5光盘上的Info\Extras\SendKeys目录下有一个SndKey32.pas文
件,其中包含了两个函数SendKeys和AppActivate,我们可以用SendKeys函数来向
WebBrowser发送回车键,我现在用的就是这个方法,使用很简单,在WebBrowser获得
焦点的情况下(不要求WebBrowser所包含的文档获得焦点),用一条语句即可:
Sendkeys('~',true);// press RETURN key
SendKeys函数的详细参数说明等,均包含在SndKey32.pas文件中。
B、在OnMessage事件中将接受到的键盘消息传递给WebBrowser。
procedure TForm1.ApplicationEvents1Message(var Msg: TMsg; var
Handled: Boolean);
{fixes the malfunction of some keys within webbrowser control}
const
StdKeys = [VK_TAB, VK_RETURN]; { standard keys }
ExtKeys = [VK_DELETE, VK_BACK, VK_LEFT, VK_RIGHT]; { extended
keys }
fExtended = $01000000; { extended key flag }
begin
Handled := False;
with Msg do
if ((Message >= WM_KEYFIRST) and (Message <= WM_KEYLAST)) and
((wParam in StdKeys) or
{$IFDEF VER120}(GetKeyState(VK_CONTROL) < 0) or {$ENDIF}
(wParam in ExtKeys) and
((lParam and fExtended) = fExtended)) then
try
if IsChild(Handle, hWnd) then { handles all browser related
messages }
begin
with {$IFDEF VER120}Application_{$ELSE}Application{$ENDIF} as
IOleInPlaceActiveObject do
Handled := TranslateAccelerator(Msg) = S_OK;
if not Handled then
begin
Handled := True;
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
except
end;
end; // MessageHandler
(此方法来自EmbeddedWB.pas)
--------------------------------------------------------------------------
------------------------------
8、直接从TWebBrowser得到网页源码及Html
下面先介绍一种极其简单的得到TWebBrowser正在访问的网页源码的方法。一般
方法是利用TWebBrowser控件中的Document对象提供的IPersistStreamInit接口来实
现,具体就是:先检查WebBrowser.Document对象是否有效,无效则退出;然后取得
IPersistStreamInit接口,接着取得HTML源码的大小,分配全局堆内存块,建立流,
再将HTML文本写到流中。程序虽然不算复杂,但是有更简单的方法,所以实现代码不
再给出。其实基本上所有IE的功能TWebBrowser都应该有较为简单的方法来实现,获
取网页源码也是一样。下面的代码将网页源码显示在Memo1中。
Memo1.Lines.Add(IHtmlDocument2(WebBrowser1.Document).Body.OuterHtml);
同时,在用TWebBrowser浏览HTML文件的时候要将其保存为文本文件就很简单
了,不需要任何的语法解析工具,因为TWebBrowser也完成了,如下:
Memo1.Lines.Add(IHtmlDocument2(WebBrowser1.Document).Body.OuterText);
--------------------------------------------------------------------------
------------------------------
9、“查找”功能
查找对话框可以在文档获得焦点的时候通过按键Ctrl-F来调出,程序中则调用
IOleCommandTarget对象的成员函数Exec执行OLECMDID_FIND操作来调用,下面给出的
方法是如何在程序中用代码来做出文字选择,即你可以自己设计查找对话框。
var
Doc: IHtmlDocument2;
TxtRange: IHtmlTxtRange;
begin
Doc :=WebBrowser1.Document as IHtmlDocument2;
Doc.SelectAll; //此处为简写,选择全部文档的方法请参见第三条
命令操作
//这句话尤为重要,因为IHtmlTxtRange对象的
方法能够操作的前提是
//Document已经有一个文字选择区域。由于接着
执行下面的语句,所以不会
//看到文档全选的过程。
TxtRange :=Doc.Selection.CreateRange as IHtmlTxtRange;
TxtRange.FindText('Text to be searched',0.0);
TxtRange.Select;
end;
还有,从Txt.Get_text可以得到当前选中的文字内容,某些时候是有用的。
--------------------------------------------------------------------------
------------------------------
10、提取网页中所有链接
这个方法来自大富翁论坛hopfield朋友的对一个问题的回答,我本想自己试验,
但总是没成功。
var
doc:IHTMLDocument2;
all:IHTMLElementCollection;
len,i:integer;
item:OleVariant;
begin
doc:=WebBrowser1 .Document as IHTMLDocument2;
all:=doc.Get_links; //doc.Links亦可
len:=all.length;
for i:=0 to len-1 do begin
item:=all.item(i,varempty); //EmpryParam亦可
memo1.lines.add(item.href);
end;
end;
--------------------------------------------------------------------------
------------------------------
11、设置TWebBrowser的编码
为什么我总是错过很多机会?其实早就该想到的,但是一念之差,便即天壤之
别。当时我要是肯再多考虑一下,多试验一下,这就不会排到第11条了。下面给出
一个函数,搞定,难以想象的简单。
procedure SetCharSet(AWebBrowser: TWebBrowser; ACharSet: String);
var
RefreshLevel: OleVariant;
Begin
IHTMLDocument2(AWebBrowser.Document).Set_CharSet(ACharSet);
RefreshLevel :=7; //这个7应该从注册表来,
帮助有Bug。
AWebBrowser.Refresh2(RefreshLevel);
--------------------------------------------------------------------------
---
该问题的URL是: http://www.delphibbs.com/delphibbs/dispq.asp?LID=2211196
欢迎经常光顾,争取上大富翁排行榜。
大富翁论坛(http://www.delphibbs.com/delphibbs)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -