棘手问题!高分,请赐教。(200分)

  • 主题发起人 主题发起人 OopsWare
  • 开始时间 开始时间
O

OopsWare

Unregistered / Unconfirmed
GUEST, unregistred user!
1.如何捕获IE、NetScape中的点击事件。
2.如何实现Spy++捕获窗口的“准星”。
 
2、到好办,只是鼠标左键一致按着的时候改变鼠标样子。
松开的时候恢复就可以了。
 
导出“蚂蚁”的AntsAPI接口,发现使用了 Initialize 函数。
在我自己创建的自动化对象中加入同样的函数,发现其与TAutoObject中继承的
Initialize用法重名。注册COM,并在浏览器Browser Helper Objects过滤中
注册此COM,发现没有反映。
 
对于IE,是不是可以做Browser Helper Object,然后通过DWebBrowserEvents2
的BeforeNavigate2得到?

至于Spy++的准星我已经不大记得了,会不会是Spy++激活的时候SetCapture的
效果?
 
谁有Browser Helper Object
bho的资料
 
>来自:coolbaby, 时间:2001-12-30 11:12:00, ID:823522
>谁有Browser Helper Object
>bho的资料

MSDN
 
选择确定会重新设置和打开FlashGet的浏览器监视功能。有时一些其他程序为了获得系统的控制权,修改了一些注册表项目,这些有时会导致FlashGet的监视功能无效,并且会耗费系统资源。使用该功能可以删除这些不必要的注册表项目。如果使用该功能依然无法打开FlashGet的监视功能,最好卸载引起问题的程序或者关闭其他软件的监视浏览器点击的功能。如果还有问题请重装FlashGet,并且注意不能安装到中文目录下。

执行完毕需要重新启动机器
(从flashget中抄的)
 
注册捕获使用的COM有两中方法
1.在注册表键HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Explorer/Browser Helper Objects
中注册你的COM GUID
2.在注册表键HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer
中的DownloadUI中注册COM
第1中方法在IE4以上就可以使用了,第2中方法需要IE5.5或以上版本。
两种方法都可以。我的COM已经可以被IE调用,
[red]关键在如何捕获其中的Open事件[/red]


 
有进展,有兴趣的富翁可访问地址 http://www.euromind.com/iedelphi/ie5tools/bho.htm
有Delphi的例子,不过试了一下午,还没成功....

我的目的是象 NetAnts,FlashGet一样,在下载 .exe 文件时弹出我的程序,如果
选择取消,IE使用其默认下载窗下载....
我尝试捕获 TIEBrowserHelper.Invoke(DispID: Integer = 207 时
给 Param[0](Wordbool) 赋值,无论True/False都会使浏览器停止浏览[xx(]...
继续试....
 
问题 2 已解决,贴出来庆祝一下:(大家可以专心帮我解决问题1了)
使用一个TWinControl的OnMouseDown和OnMouseUp事件,Down时:
procedure TForm1.Button5MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
hico := GetCursor;
SetCursor(hI);
end;
// Up时
procedure TForm1.Button5MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var p: TPoint;
t, pw: THandle;
b: Boolean;
buf: array[0..256] of char;
begin
Memo1.Clear;
p.X := X;
p.Y := Y;
Windows.ClientToScreen(Button5.Handle , p);
SetCursor( hico );
t := WindowFromPoint(p);
Memo1.Lines.Add('Handle is :'+IntToStr(t));
b := IsWindow(t);
if not b then Exit;
GetWindowText(t, @buf[0], 255);
Memo1.Lines.Add('Window Text is: ' + Buf);
GetClassName(t, @buf[0], 255);
Memo1.Lines.Add('Class Name is: ' + Buf);
Memo1.Lines.Add('--');
pw := GetParent(t);
while pw<>0 do begin
GetWindowText(pw, @buf[0], 255);
Memo1.Lines.Add('Perant Window Text is: ' + Buf);
GetClassName(pw, @buf[0], 255);
Memo1.Lines.Add('Perant Class Name is: ' + Buf);
Memo1.Lines.Add('--');
pw := GetParent(pw);
end;
end;
其中 var hI: HCURSOR;在Form.OnCreate时 hI := LoadCursor(hInstance, 'SIGN');
(光标用ImageEdit加到res文件中),关闭窗口时DestroyCursor(hI);释放。
hico: HCURSOR;用来记录旧关标
 
这就是flashget接口com文件,你研究一下吧
<script language="VBScript">
'Great thanks to Vladimir Romanov(Author of ReGet Pro)
'Download selected link

Sub AddLink(Url,Info)
On Error Resume Next
set JetCarCatch=CreateObject("JetCar.Netscape")
if err<>0 then
MsgBox("FlashGet not properly installed!"+ vbCrLf+"Please install FlashGet again")
else
call JetCarCatch.AddUrl(Url, Info, external.menuArguments.document.Url)
end if
end sub

Sub OnContextMenu()
set srcEvent = external.menuArguments.event
set EventElement = external.menuArguments.document.elementFromPoint ( srcEvent.clientX, srcEvent.clientY )
if srcEvent.type = "MenuExtAnchor" then
set srcAnchor = EventElement
do until TypeName(srcAnchor)="HTMLAnchorElement"
set srcAnchor=srcAnchor.parentElement
Loop
Call AddLink(srcAnchor.href,srcAnchor.innerText)
elseif srcEvent.type="MenuExtImage" then
if TypeName(EventElement)="HTMLAreaElement" then
Call AddLink(EventElement.href,EventElement.Alt)
else
set srcImage = EventElement
set srcAnchor = srcImage.parentElement
do until TypeName(srcAnchor)="HTMLAnchorElement"
set srcAnchor=srcAnchor.parentElement
if TypeName(srcAnchor)="Nothing" then
call AddLink(srcImage.href,srcImage.Alt)
exit sub
end if
Loop
Call AddLink(srcAnchor.href,srcImage.Alt)
end if
elseif srcEvent.type="MenuExtUnknown" then
set srcAnchor = EventElement
do until TypeName(srcAnchor)="HTMLAnchorElement"
set srcAnchor=srcAnchor.parentElement
if TypeName(srcAnchor)="Nothing" then
Call AddLink(EventElement.href,EventElement.innerText)
exit sub
end if
Loop
Call AddLink(srcAnchor.href,srcAnchor.innerText)
elseif 1=1 then
MsgBox("Unknown Event Source """ + srcEvent.type + """" + vbCrLf + "Please send description of error to jetcar@163.net")
end if
end sub


call OnContextMenu()

</script>

 
我不懂,嘻嘻
 
to sunstone:
这明明是VBScript,怎是COM,您到需要多花点时间研究一下了[xx(]。

这段脚本是在IE右键菜单时将浏览器中的链接传给一个COM。这些我早就实现了。
我还发现FlashGet,NetAnts,的此段脚本都是照抄的“吸血鬼”。我不想照抄,
想用JavaScript写,发现JS中的typeof()不能代替VBS中的TypeName()。不知谁有高见?

 
按照 http://www.euromind.com/iedelphi/ie5tools/bho.htm 的方法。
可以捕获所有 OnDownloadBegin 和 OnBeforeDownload 事件。但是,所有的
下载,包括打开网页也会激发此两个事件(OnBeforeDownload需要IE5.5或以上版本)。
如果要打开的链接是 http://www..../../target.exe 形式的地址,我可以直接判断。
如果是 http://www...../.../...search.asp?id=12345 之类的有重定向的链接,我就
不能判断目标文件的扩展名了。

还有一个事,谁知道如何在 http://www.radiate.com/ 上申请注册用户,
我需要在我的程序中加一个 Radiate 的广告条。

 
[xx(][xx(][xx(][xx(] 为什么没人帮我 [xx(][xx(][xx(][xx(]
我作完了,贴出来,大家给找找有没 BUG 吧!

library Project12;
uses
ComServ,
Project12_TLB in 'Project12_TLB.pas',
Unit12 in 'Unit12.pas' {MyIEDownloadCatch: CoClass};
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
{$R *.TLB}
{$R *.RES}
begin
end.

unit Project12_TLB;
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
interface
uses ActiveX, Classes, Graphics, StdVCL, Variants, Windows;
const
Project12MajorVersion = 1;
Project12MinorVersion = 0;
LIBID_Project12: TGUID = '{BF21D45B-7007-4FDC-B6F9-A0A8E61C6F88}';
implementation
uses ComObj;
end.

unit Unit12;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
ComObj, ActiveX, Project12_TLB, StdVcl, Windows, shdocvw, SysUtils;
type
TMyIEDownloadCatch = class(TComObject, IDispatch, IObjectWithSite)
protected
function SetSite(const pUnkSite: IUnknown): HResult; stdcall;
function GetSite(const riid: TIID; out site: IUnknown): HResult; stdcall;
function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; virtual; stdcall;
end;
var
IE: IWebbrowser2;
implementation
uses ComServ;
var
Cookie: Integer;
CP: IConnectionPoint;
Url: OleVariant;
const
DISPID_BEFORENAVIGATE2 = 250; // hyperlink clicked on
DISPID_ONQUIT = 253;
DISPID_FILEDOWNLOAD = 270;
function TMyIEDownloadCatch.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
var
dps: TDispParams absolute Params;
b : WordBool;
rc: Integer;
begin
try
Result := S_OK;
case DispId of
DISPID_BEFORENAVIGATE2: Url := POleVariant(dps.rgvarg^[5].pvarval)^;
DISPID_FILEDOWNLOAD: begin
b:= dps.rgvarg^[1].vbool;
if not b then begin
rc := MessageBoxW(0, PWideChar('使用我的软件下载:'+WideString(Url)) , '', MB_YESNO);
if rc = ID_YES then dps.rgvarg^[1].pbool^ := WordBool(-1);
end;
end;
DISPID_ONQUIT: CP.Unadvise(Cookie);
else Result := DISP_E_MEMBERNOTFOUND;
end;
finally
end;
end;
function TMyIEDownloadCatch.GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;
begin
Result := E_NOTIMPL;
end;
function TMyIEDownloadCatch.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult;
begin
Result := E_NOTIMPL;
pointer(TypeInfo) := nil;
end;
function TMyIEDownloadCatch.GetTypeInfoCount(out Count: Integer): HResult;
begin
Result := E_NOTIMPL;
Count := 0;
end;
function TMyIEDownloadCatch.SetSite(const pUnkSite: IUnknown): HResult;
var
CPC: IConnectionPointContainer;
begin
if Assigned(pUnkSite) then
begin
IE := pUnkSite as IWebbrowser2;
CPC := IE as IConnectionPointContainer;
CPC.FindConnectionPoint(DWebBrowserEvents2, CP);
CP.Advise(Self, Cookie);
end;
Result := S_OK
end;
function TMyIEDownloadCatch.GetSite(const riid: TIID; out site: IUnknown): HResult;
begin
Result := S_OK;
end;
initialization
TComObjectFactory.Create(ComServer, TMyIEDownloadCatch, LIBID_Project12, '', '', ciMultiInstance, tmApartment);
end.

编译完成将其注册,然后在
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Explorer/Browser Helper Objects
下加如项{BF21D45B-7007-4FDC-B6F9-A0A8E61C6F88}
搞定。能看明白的富翁帮分析一下还有没其它可能出现,但是我没有想到的情况?


[red]还有一个事,谁知道如何在 http://www.radiate.com/ 上申请注册用户,
我需要在我的程序中加一个 Radiate 的广告条。[/red]

 
OopsWare,你写的下载软件比FlashGet如何?如果你能超越他就很不错,如果不能,那也就只能
自己练练技术了.我对这方面也比较感兴趣,我下载资料就很喜欢用FlashGet,可我基本上找
不出他还有什么大的不足之处,想想我就是写一个出来也不能超过他,那何必花时间去重复开
发呢.还有,你能不能将页面中的链接直接拉到下载中去?
不过,自己练习写这么一个软件出来,对自己本身,特别是在网络方面会有很大提高.可惜我没
时间,人又懒,等我勤快了,我也来试着写一个,呵呵...
OopsWare,能不能让我也测试测试?你可以只发一个执行档给我.我想看看.
kan@freetrend.com.vn
 
尚未完成,应该在春节之前可以发布了[:D]
我最初只是想将 FlushGet和StreamBox的功能和在一起,细作起来,才发现许多需要
解决的问题。我更习惯NetAnts的界面,所有我的软件看起来有些像蚂蚁,功能上
更接近FlushGet。RTSP协议方面还稍有些问题(554端口方式)。
 
准星功能有什么作用呢??[:)]

还有,你把图片、文字等拖到flashget的小窗上边。弹出
来的提示可以让你下图片呢。可能,Delphi很难做吧。
 
通过IDropTarget(ActiveX.pas中定义)接口可以实现接收Windows中的所有拖拽操作。
我的程序目前支持5中方式取得下载链接
1.浏览器中的右键菜单
2.监视简帖板
3.浏览器中元素的拖拽
4.设置成为IE的默认下载工具
5.将“准星”拖拽到要下载的页面上,分析浏览器中的所有链接
(专门对付那些没有右键菜单,又没法查看源程序的页面!)。
 
看来写得不错,什么时候写好了,记得给小弟见识一下,试用试用,说不定我就把FlashGet给扔
了.祝你早点写好哈.
 

Similar threads

后退
顶部