如果只是启动时
可以参SCript 中的 window.open方法
可以参SCript 中的 window.open方法
解决方案 »
- 关于ADOQuery和DBGrid的问题
- 大家帮忙!关于投票系统,用DBGRID能实现吗?急
- 高分,求高人指点迷津!!! 对于delphi调用vc Dll函数,参数传地址的方式如何完成!!!
- 三方控件路径问题!
- 如何在动态产生的Edit中响应Edit的KeyPress事件?
- 这个小程序段何处出错?
- 运行时调整控件大小位置的代码(非常有用),请大家看看;兼我的问题
- 16进制,二进制,10进制之间的转换函数?急
- MIDAS问题(请高手赐教)
- 急! 如何关闭运行SQL时的砂漏CURSOR,或如何使控件根据数据库中的数值实时变化。
- BDE BUG!?熟悉bde者请进
- 救助高手!我做了个用ADO与SQL连的数据库系统!有一台机器始终不能连上,而别的机器都能连上!但把这台机器装个SQL客户端就可以运行了!
Form1: TForm1;
IEApp: Variant;
d2:tdatetime;
implementationuses Unit2;{$R *.DFM}procedure TForm1.Timer1Timer(Sender: TObject);
var
d1:tdatetime;
F: TextFile;
S: string;
begin
d1:=now;
if formatdatetime('hh:nn:ss',d1)=formatdatetime('hh:nn:ss',d2) then
begin
IEApp := CreateOLEObject('InternetExplorer.Application');
IEApp.visible := true;
IEApp.Navigate('http://127.0.0.1/sendmessage.asp');
vpi_ifexe:=true;
end;
if vpi_ifexe then
begin
AssignFile(F, 'D:\Inetpub\wwwroot\ifexeasp.txt');
Reset(F);
Readln(F, S);
if copy(s,length(s),1)='1' then
begin
IEApp.quit ;
vpi_ifexe:=false;
end;
closefile(F)
end;
end;还有很多属性其中包括你想要的
end.
由于IE浏览器控件需要提供显示功能才能使用,所以不能在程序中用CreateOleObject取得一个实例后直接使用其属性和方法,否则程序在运行时会引起错误;这时需要用Delphi中提供的 “Import ActiveX Control”功能,操作方法见下所述。 在“Components”菜单中,调用“Import ActiveX Control”功能,在Registered Controls (注册控件)列表中选择“Microsoft Internet Controls(Version1.1)”,下方的提示栏中显示出其路径为C:\PWin98\System\SHDOCVW.DLL,在Class Names(类型列表)中列出了可注册的三个控件: TWebBrowser_V1、TWebBrowser和TShellFolderViewOC,分别为IE3浏览器控件、IE4浏览器控件和 “Microsoft外壳文件夹查看路由器”控件。单击Install进行安装。安装完成后,在“ActiveX” 控件栏中,将增加三个控件,分别为TWebBrowser_V1、TWebBrowser和TShellFolderViewOC;在 Delphi的Imports目录下,将创建一个文件SHDocVw_TLB.PAS,其中有这三个控件的包装细节,当然含控件的属性和方法说明了,它可以作为我们使用控件的参考资料。 二、 在Delphi程序中使用IE浏览器控件
以TWebBrowser(IE4浏览器控件)为例子。
TWebBrowser的常见属性和方法主要有:
GoBack:方法,后退到上一个页面。
GoForward:方法,前进到下一个页面。
GoHome:方法,调用默认的主页页面,
该页面在IE的选项中设定。
GoSearch:方法,调用默认的搜索页面,
该页面在IE的选项中设定。
Navigate(const URL: WideString;
var Flags, TargetFrameName, PostData,
Headers: OleVariant):方法,
调用指定页面,具体参数如下:
URL:指定页面的URL。Flags:
Word类型,作用还不清楚,可设为0。
TargetFrameName:WideString,
打开页面所在的Frame,为空字符串时在当前的
Frame中打开;TargetFrameName
指定的Frame存在时在Frame中打开;
TargetFrameName指定的Frame
不存在时则新建一个窗口打开,此时就相当
于调用外部的IE浏览器了。
PostData:boolean,是否允许发送数据。
Headers:WideString,
要发送的URL请求的头部数据。
Refresh:方法,刷新当前页面。
Stop:方法,停止调用或打开当前页面。
LocationName:属性(WideString),当前位置的名称。
LocationURL:属性(WideString),当前位置的URL。
Busy: 属性(Boolean),是否正忙。
Visible: 属性(Boolean),浏览器窗口是否可见。 ////////////
(以下属性为在TWebBrowser新增,
TWebBrowser_V1中没有,其作用有待探索)
StatusBar: 属性(Boolean),是否显示状态栏。/////////////look here
StatusText: 属性(WideString),状态栏内容。
ToolBar: 属性(SYSINT),工具栏中的内容。/////////////here
MenuBar: 属性(Boolean),是否显示菜单条。//////////////here
FullScreen: 属性(Boolean),是否全屏显示。//////////////here
Offline: 属性(Boolean),是否脱机浏览。
AddressBar: 属性(Boolean),是否显示地址栏。////////////hereTWebBrowser的常见事件主要有:
OnStatusTextChange = procedure
(Sender: TObject; const Text: WideString)
of object;
在状态栏提示信息变化时发生,参数Text为当前状态栏提示信息,我们可以根据该信息来更新我们自己的状态栏提示信息或处理其它的事务. OnProgressChange = procedure(Sender: TObject; Progress, ProgressMax: Integer) of object; 在打开页面的进度变化时发生,参数Progress为当前进度,ProgressMax为总进度,我们可以根据这两个参数来更新我们自己的状态栏提示信息或处理其它的事务. OnCommandStateChange = procedure(Sender: TObject; Command: Integer; Enable: WordBool) of object; 当执行新的命令时发生,Command为命令标识,Enable为是否允许执行该命令. OnTitleChange = procedure(Sender: TObject; const Text: WideString) of object; 在页面的标题发生变化时发生,Text为当前标题. OnPropertyChange = procedure(Sender: TObject; const Property_: WideString) of object; 在页面的属性发生变化时发生,Property_为属性名称 OnDownloadComplete: TNotifyEvent 在下载页面完成后发生. OnDownloadBegin: TNotifyEvent 在下载页面开始前发生. 三、 在Delphi程序中应用IE浏览器控件的两个例子
(1)制作自己的帮助系统 我们利用IE浏览器控件为用户制作了一个帮助系统,帮助文件由多个HTML文件组成,一个主题对应一个 HTML文件(Topic.HTM),每个主题下的项目对应HTML文件中的一个标签(#Item)。这样在我们的系统中,就不必再调用IE浏览器或WinHelp程序来为用户提供帮助了。相信大家知道HTML帮助文件与传统的HLP帮助文件相比的优势所在吧。 在下面例子中,演示了TWebBrowser(IE4浏览器控件)的Navigate方法的使用方法。请注意程序中的注释。(下面为程序的主要片段)。 {根据主题和项目调用帮助文件}
procedure ShowHelp
( HelpTopic,HelpItem : String );
var
TargetFrameName,PostData,
Heads,Flags : OleVariant;
URL : widestring;
begin
TargetFrameName := '';{指定Frame的空字符串时,
则在当前Frame中打开帮助文件}
PostData := false;{不发送数据}
Heads := '';{Header信息为空}
Flags := 0;{Flags设为0}
URL := HelpTopic + '.HTM#'+HelpItem;
{帮助信息的URL}
with formHelp.webbrowser do{在帮助窗口
中的IE浏览器控件中显示帮助信息}
begin
navigate(URL,Flags,TargetFrameName,
PostData,Heads);{显示帮助信息}
end;
end;
(2)显示一个GIF动画 假如你还没有一个适合的动画显示控件,不妨试用一下下面方法. procedure ShowGIF( GIFFileName : String );
var
TargetFrameName,PostData,Heads,Flags : OleVariant;
URL : widestring;
begin
TargetFrameName := '';{指定Frame的空字符串时,
则在当前Frame中打开动画文件}
PostData := false;{不发送数据}
Heads := '';{Header信息为空}
Flags := 0;{Flags设为0}
URL := GIFFileName;
with formGIF.webbrowser do{在指定窗口中的
IE浏览器控件中显示动画}
begin
navigate(URL,Flags,TargetFrameName
,PostData,Heads);{显示动画文件}
end;
end;
var
Reg1: TRegistry;
begin
Reg1:=TRegistry.Create;
Reg1.RootKey := HKEY_LOCAL_MACHINE;
Reg1.OpenKey('\SOFTWARE\Microsoft\Internet Explorer\Extensions', True);
Reg1.CreateKey('{37E91B47-F40A-11D1-B792-444553540000}');
Reg1.OpenKey('\SOFTWARE\Microsoft\Internet Explorer\Extensions\{37E91B47-F40A-11D1-B792-444553540000}', True);
Reg1.WriteString('ButtonText', '按钮名称');//按钮名
Reg1.WriteString('CLSID','{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}');//系统默认id,是一定,你可以参考网络蚂蚁的
Reg1.WriteString('Default Visible', 'Yes');//缺省可以
Reg1.WriteString('Exec', 'F:\烟叶\Baccy.exe'); //按钮要执行的事件
Reg1.WriteString('HotIcon', 'C:\WIN98\WINUPD.ICO');//热图标
Reg1.WriteString('Icon', 'C:\WIN98\WEB\chang.ico');//图标
Reg1.CloseKey;
Reg1.Free;
end;改变IE工具栏的背景
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,registry,
StdCtrls, ExtDlgs;type
TForm1 = class(TForm)
Button1: TButton;
OpenPictureDialog1: TOpenPictureDialog;procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
var
Reg1: TRegistry;
s:string;
begin
Reg1:=TRegistry.Create;
Reg1.RootKey := HKEY_CURRENT_USER;Reg1.OpenKey('\Software\Microsoft\Internet Explorer\Toolbar', True);
s:=Reg1.ReadString('backbitmap');
if s='' then//没有背景当然有也可以改变
beginif OpenPictureDialog1.Execute then
begin
s:=OpenPictureDialog1.FileName;//只能为BMP
Reg1.WriteString('backbitmap', s);
end;end;
Reg1.CloseKey;
Reg1.Free;end;读取IE收藏夹内网址的信息
procedure TForm1.ToolButton1Click(Sender: TObject);
label
Write;
var
Favorites:String;
Search:TSearchRec;
begin
Favorites:=GetFavoritesPath;
if Favorites='' then
begin
MessageBox(Handle,'访问收藏夹主键错误!','提示信息',MB_OK);
exit;
end;
Memo1.Clear;
with Search,Memo1.Lines do
begin
if FindFirst(Favorites+'*.url',0,Search)=0 then
begin
Write:
Add(GetFavoritesUrl(Favorites+Name));
SetLength(Name,Length(Name)-4);
Add(Name);
if FindNext(Search)=0 then
goto Write;
end;
end;
end;function TForm1.GetFavoritesPath:String;
var
reg:TRegistry;
begin
Result:='';
reg:=TRegistry.Create;
with reg do
begin
RootKey:=HKEY_USERS;
if OpenKey('.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders',false)=true then
Result:=ReadString('Favorites')+'\';
CloseKey;
Free;
end;
end;{function TForm1.GetFavoritesUrl(FavoritesFile: String): String;
begin
with TIniFile.Create(FavoritesFile)do
begin
Result:=ReadString('InternetShortcut','URL','');
Free;
end;
end;}function TForm1.GetFavoritesUrl(FavoritesFile: String): String;
var
i:integer;
begin
Result:='';
with TStringList.Create do
begin
LoadFromFile(FavoritesFile);
i:=IndexOf('[InternetShortcut]');
if i=-1 then
exit;
Result:=Strings[i+1];
System.Delete(Result,1,4);
Free;
end;
end;
浙江大学计算机系 (310027)
胡朝晖 陈奇 俞瑞钊 ------------------------------------------------------------------------------------ 如何实现对IE浏览器中对象的操作是一个很有实际意义的问题,通过和IE绑定的DLL 我们可以记录IE浏览过的网页的顺序,分析用户的使用行为和模式。我们可以对网页的内容进行过滤和翻译,可以自动填写网页中经常需要用户填写的Form内容,等等。 ----本文所有的例子代码都是通过VC来表示的,采用的原理是,通过和IE对象接口的交互来实现对IE的访问。实际上是采用COM的技术,COM 是和语言无关的一种二进制对象交互的模式,所以实际上下面所描述的内容都可以用其他的语言来实现,比如VB、Delphi、C++ Builder等等。 一 实现IE实例遍历
----首先我们来看系统是如何知道当前有多少个IE的实例在运行。
----在Windows体系结构下,一个应用程序可以通过操作系统的运行对象表来和这些应用的实例进行交互。但是IE当前的实现机制是不在运行对象表中进行注册,所以需要采用其他的方法。可以通过ShellWindows集合来代表属于shell 的当前打开的窗口的集合,而IE就是属于shell的一个应用程序。 ----下面描述一下用VC实现对当前 IE实例进行遍历的方法。IShellWindows是关于系统shell的一个接口,可以定义一个如下的接口变量: ----SHDocVw::IShellWindowsPtr m_spSHWinds; ----然后创建变量的实例:
m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)); ----通过IShellWindows接口的方法GetCount可以得到当前实例的数目:
----long nCount = m_spSHWinds->GetCount(); ----通过IShellWindows接口的方法Item可以得到每一个实例对象:
----IDispatchPtr spDisp;
----_variant_t va(i, VT_I4);
----spDisp = m_spSHWinds->Item(va); ----然后可以判断实例对象是不是属于IE浏览器对象,通过下面的语句实现:
----SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
----assert(spBrowser != NULL) ----在得到了IE浏览器对象以后,可以调用IWebBrowser2Ptr 接口的方法来得到当前的文档对象的指针:
---- MSHTML::IHTMLDocument2Ptr spDoc(spBrowser- >GetDocument()); ----然后就可以通过这个接口对这个文档对象进行操作,比如通过Gettitle得到文档的标题。 ----在浏览网络的时候,一般总会同时开很多IE的实例,如果这些页面都是很好的话,我们可能想保存在硬盘上,这样,需要对每一个实例进行保存,而如果采用上面的原理,就可以得到每一个IE的实例及其网页对象的接口,这样就可以通过一个简单的程序来批量保存当前的所有打开的网页。 ----采用上面介绍的方法实现了对当前IE实例的遍历,但是我们希望得到每一个IE实例所产生的事件,这就需要通过DLL的机制来实现。 二 实现和IE相绑定的DLL
----介绍一下如何建立和IE进行绑定的DLL的实现的过程。为了和IE的运行实例进行绑定,需要建立一个能够和每一个IE实例进行绑定的DLL。 IE的启动过程是这样的,当每一个IE的实例启动的时候,它都会在注册表中去寻找一个 CLSID,具体的注册表的键位置为:
----HKEY_LOCALL_MACHINE\SOFTWARE\Microsoft\
Windows\CurrentVersion\Explorer\B rowser Helper Objects
----当在这个键位置下存在CLSIDs的时候,IE会通过使用 CoCreateInstance()方法来创建列在该键位置下的每一个对象的实例。注意对象的CLSIDs 必须用子键而非名字值的形式表现,比如{DD41D66E-CE4F-11D2-8DA9- 00A0249EABF4}就是一个有效的子键。 ----使用DLL的形式而非EXE的形式的原因是因为DLL和IE 实例运行在同一个进程空间里面。每一个这种形式的DLL必须实现接口IObjectWithSite,其中方法SetSite必须被实现。通过这个方法,我们自己的DLL就可以得到一个指向IE COM对象的IUnknown的指针,实际上通过这个指针就可以通过COM对象中的方法 QueryInterface来遍历所有可以得到的接口,这是COM的基本的机制。当然需要的只是 IWebBrowser2这个接口。 ----实际上建立的是一个COM对象,DLL只不过是COM对象的一种表现形式。COM对象需要建立和实现的方法有: ----1.实现IOleObjectWithSite接口的方法SetSite。---- ----实际上IE实例通过这个方法向COM对象传递一个接口的指针。假设有一个接口指针的变量,不妨设为:
----CComQIPtr m_myWebBrowser2; ----就可以在方法SetSite中把这个传进来的接口的指针赋给m_myWebBrowser2。 ---- 2.在得到了指向IE COM对象的接口后,需要把自己的DLL和IE实例所发生的事件相关联。 ---- 为了实现这个目的,需要介绍两个接口: ----(1) IConnectionPointContainer。这里使用这个接口的目的是根据它得到的IID来建立和DLL的一个特定的连接。比如可以进行如下的定义:
---- CComQIPtr----&IID_IConnectionPointContainer >
----spCPContainer(m_myWebBrowser2); ----然后,需要把所有IE中发生的事件和DLL进行通信,可以使用IConnectPoint。 ----(2) IConnectPoint。通过这个接口,客户可以对连接的对象开始或者是终止一个advisory循环。IConnectPoint有两个主要的方法,一个为 Advice,另一个为Unadvise。对于我们的应用来说,Advise是用来在每一个IE发生的事件和DLL之间建立一个通道。而Unadvise就是用来终止以前用Advise建立的通知关系,比如可以定义IConnectPoint接口如下:
---- CComPtr spConnectionPoint; ----然后,要使所有在IE实例中发生的事件和我们的DLL相关,可以使用如下的方法:
---- hr =spCPContainer- >FindConnectionPoint(DIID_DWebBrowserEvents2, &spConnectionPoint); ----然后通过IConnectPoint接口的方法Advice使每当IE有一个新的事件发生的时候,都能够让DLL知道。可以用如下的语句实现:
----hr = spConnectionPoint->Advise((IDispatch*)this, & m_dwIDCode); ----在把IE实例中的事件和我们的DLL之间建立联系以后,我们可以通过IDispatch接口的Invoke()方法来处理所有的IE的事件。 ----3.IDispatch接口的Invoke()方法。 ----IDispatch是从IUnknown中继承的一个接口的类型,通过 COM接口提供的任何服务都可以通过IDispatch接口来实现。IDispatch::Invoke的工作方式同vtbl幕后的工作方式是类似的,Invoke将实现一组按索引来访问的函数,我们可以对 Invoke方法进行动态的定制以提供不同的服务。Invoke方法的表示如下:
----STDMETHOD(Invoke)(DISPID dispidMember,REFIID riid, LCID lcid, WORD wFlags,DISPPARAMS * pdispparams, VARIANT * pvarResult,EXCEPINFO * pexcepinfo, UINT * puArgErr); ----其中,DISPID是一个长整数,它标识的是一个函数。对于IDispatch的某一个特定的实现,DISPID都是唯一的。IDispatch的每一个实现都有其自己的IID,这里dispidMemeber实际上是可以认为是和IE实例所发生的每一个事件相关的方法,比如:DISPID_BEFORENAVIGATE2,DISPID_NAVIGATECOMPLETE2等等。 ----这个方法中另外一个比较重要的参数是DISPPARAMS,它的结构如下: typedef struct tagDISPPARAMS
{
VARIANTARG* rgvarg;
//VARIANTARG是同VARAIANT相同的,
可以在OAIDL.IDL中找到。
所以实际上rgvarg是一个参数数组
DISPID* rgdispidNameArgs; //命名参数的DISPID
unsigned int cArgs;//表示数组中元素的个数
unsigned int CnameArgs; //命名元素的个数
}DISPPARAMS----要注意的是每一个参数的类型都是VARIANTARG,所以在IE和我们DLL之间可以传递的参数类型的数目是有限的。只有那些能够被放到 VARIANTARG结构中的类型才可以通过调度接口进行传递。 ----比如对于事件DISPID_NAVIGATECOMPLETE2来说:第一个参数表示IE在访问的URL的值,类型是VT_BYREF|VT_VARIANT。注意 DISPID_NAVIGATECOMPLETE2等DISPID已经在VC中被定义,我们可以直接进行使用。 ----如上所述,我们在方法Invoke中可以得到所有IE实例所发生的事件,我们可以把这些数据放到文件中进行事后的分析,也可以放到一个列表框中实时显示。 ----4.微软的Html文档对象模型和应用分析。 ----下面我们来看如何得到网页文档的接口:网页文档的接口为IHTMLDocument2,可以通过调用IE COM对象的get_Document方法来得到网页的接口。使用如下的语句: hr = m_spWebBrowser2- >
get_Document(&spDisp);
CComQIPtr spHTML;
spHTML = spDisp;----这样我们就得到了网页对象的接口,然后我们就可以对网页进行分析,比如通过IHTMLDocument2提供的方法get_URL可以得到和该网页相关的 URL的地址值,通过get_forms方法可以得到该网页中所有的Form对象的集合。 ----实际上W3C组织已经制定了一个DOM(Document Objec Model)标准,当然这个标准不仅仅是针对HTML,同时还是针对XML制定的。W3C 组织只是定义了网页对象的接口,不同的公司可以采用不同的语言和方法进行具体的实现。按照W3C组织定义的网页对象被认为是动态的,即用户可以动态对网页对象里面所包含的每一个对象进行操作。这里的对象可以是指一个输入框,也可以是图像和声音等对象。同时按照W3C的正式文档的说明,网页对象是可以动态增加和删除的。事实上,很少有厂商实现了DOM定义的所有功能。微软对网页对象的定义也基本上是按照这个标准实现的。但是当前的接口还不支持动态增加和删除元素,但是可以对网页中的基本元素进行属性的修改。比如IHTMLElementCollection表示网页中一些基本的元素的集合, IHTMLElement表示网页中的一个基本的元素。而像IHTMLOptionElement接口就表示一个特定的元素Option。基本的元素都有setAttribute和geAttribute方法来动态设置和得到元素的名称和值。 ----较为常见的一个应用是我们能够分析网页中是否
BHO也是一个理想的方法