ViewObject 以及和IE交互的问题思考。(200分)

  • 主题发起人 主题发起人 yifeng
  • 开始时间 开始时间
Y

yifeng

Unregistered / Unconfirmed
GUEST, unregistred user!
和IE交互的方法似乎大家都知道了,可以用ShellWindow取得IE实例的接口。取得IE接口后
按道理,我们应该可以做任何接口已经实现的事情了。 比如这里的ViewObject
IE.document.queryinterface(IViewObject,viewObject)
ViewObject.draw(dv.._content, nil,nil, self.handle, image1.canvas.handle, ...
Viewobject的参数我记不得了,大意就是我把网页在image1的canvas上画出来。

如果我自己的程序里面用Twebbrowser,可以获得网页的图像
如果我把程序写成helper object,也可以获得图像
当我是一个单独的程序的时候,虽然取得了viewobject的接口,draw操作确失败。然而,
诸如读源码等通过其它接口实现的功能却一个也不少。

能告诉我为什么吗?

需要源代码,我会贴上来。
 
没人知道吗?
 
可以先看看你写的代码吗
 
sorry,代码在另一台电脑里, 现在不在身边
明天贴上来
 
"当我是一个单独的程序的时候" 什么意思?
 
我的原码:(部分)
procedure TForm1.Button1Click(Sender: TObject);
var
ShellWindow: IShellwindows;
i:integer;
xweb:IWebBrowser2;
IDoc1: IHTMLDocument2;
ViewObject: IViewObject;
sourceDrawRect: TRect;
myBitmap:TBitMap;
r:integer;
begin
shellwindow:= CoShellWindows.Create;
myBitMap:= TBitMap.Create;
for i:=0 to shellwindow.Count-1 do begin
xWeb:=shellwindow.Item(i) as IWebbrowser2;
try
Xweb.Document.QueryInterface( IHTMLDocument2,IDoc1);
if IDOc1<> nil then begin
ListBox1.Items.Add(IDoc1.URL);
Memo1.Lines.Add(IDoc1.body.OuterHtml);
xWeb.Document.QueryInterface(IViewObject,ViewObject);
myBitmap.Width:=xweb.width;
myBitMap.Height:=xweb.height;
sourceDrawRect := Rect(0, 0, xweb.Width, Xweb.Height);
r:=ViewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, self.Handle,
mybitmap.Canvas.Handle, @sourceDrawRect, nil, nil, 0);
end;
except
end;
end;
end;

mybitmap的结果是空的

>>"当我是一个单独的程序的时候" 什么意思?

我用ishellwindow取得IE的接口,本身我是一个exe应用程序,而不是一个 browser helper object
(dll) ,或者直接在我的程序中使用TWebBrowser.


 
顺便一个问题,搞不懂好久了:
xWeb.width xWeb.Height只是IE窗体的大小。
知道如何取得IE窗口中网页显示部分的大小吗?有什么接口可以利用
 
>>如果我自己的程序里面用Twebbrowser,可以获得网页的图像

我用TWebbrowser也不行!请问你是怎么做的?
 
谢谢control, 网页大小已经取得

如果这样不行的话, 我打算给浏览器加上一个menu item: get screenshot, 点击之后
把网页的screenshot送入我的程序中。这个思路应该如何完成? 请提示。
如果我写一个单纯的helper object是可以的,如何把helper object获得的数据传递给我
另外一个程序?
真是头痛的问题,各位指教!
 
我以前是用wm_copydata的。后来才明白(经过各位大虾的指教),在一个bho的实例中
sendmessage为什么会老是出错:(。共享内存的办法可用,但后台的程序没法知
道,dll什么时候会做写操作 :(
 
你是说bho没法发送message? 对阿,不知道怎样才能传个指针什么的。。。
我觉得是否可以参考flashget,netant,他们是怎么把链接的信息传递的?
想不通。
 
是没法用wm_copydata而已。
我最后是用自定义消息和文件映射对象传具体的数据。
 
g622,详细点可以吗? 最好有例子, 多谢了。
 
自定义消息和文件映射对象都是前面讨论过的
我只是在映射内存的第一个字节定义了消息的类型,第二三字节定义消息内容的长度,
4字节以后是具体的内容。在bho的事件通知里findwindow然后postmessage。后台程序
在接到自定义消息后,到映射的内存里看消息的具体类型和内容。
其实这样做是有问题的,并发的情况彻底没考虑。
 
为什么不能通过接口实现?

我的想法是你的程序实现一个Dispatch接口
在bho中创建此接口,传递参数
想法而已,没有试验过。

不知道你在bho中实现时,截图效果如何?
我在自己程序中实现时,要不把滚动条也画出来了,要不被缩放了
 
多人接受答案了。
 
朋友,请教几个问题:
1、如何即时取得鼠标所指向的超级连接的url(指的是在各类浏览器中)
2、如何获得ie状态栏中的内容
 
不行,可能是ie对这个接口支持的不好吧
就算是我在程序中使用webbrowser,如果
width和height设置的不对的话,webbrowser就会变花

网页部分的大小可以用body的
offsetwidth,scrollwidth等等
还有body的style里的一些参数.
 
后退
顶部