delphi中嵌ie browser的问题,今晚解决不了,我不能回去吃饭(200点)

Tommy Chang 2000-01-31 07:45:00
加精
在form中嵌webbrowser(delphi 5.0中internet页下的,实际就是ie 5.0(Microsoft Internet Control)),但是使用webbrowser.setfocus设置焦点失败(因为要使用keybd_event来模拟键盘输入,所以必须给其设置焦点),没有出错信息,keybd_event失效。当鼠标点击控件中任意一点后,WEBBROWSER可以得到焦点,keybd_event才有效.而VB的版本则无此问题.
通过寻找子窗口,可以得知WEBBROWSER有以下三层结构(以下是WINDOW CLASSNAME)
Shell Embedding(即WEBBROWSER本身)
-Shell DocObject View
--Internet Explorer_Server
我分别将这三个窗口的句柄分别用SDK API:setfocus函数来设置焦点,但是都无效.
从VB写的版本中可以知道在第三层同DELPHI版本的消息确实不同,VB版本的第三层可以收到SET_FOCUS的消息,而DELPHI版本则没有.
除了模拟鼠标点击BROWSER控件,有没有其他办法.
顺便提一下,发WM_VSCROLL消息给WEBBROWSER第一层也不响应.
我的地址: cxgtommy@21cn.com
oicq: 1766598
谁有好主意,请尽快联系我

明天交货,我今天一定要完成,
...全文
2037 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tommy Chang 2000-11-19
  • 打赏
  • 举报
回复
呵呵,在看msdn文挡时,上面说回车响应之类键盘事件可以随时打开或关闭的,但有些delphi的帖子说在delphi中照做可能会导致程序异常操作,哪位愿意试下。

:)
78product 2000-11-08
  • 打赏
  • 举报
回复


而且当访问到有<textarea>的地方,也就是论坛写帖子的地方,回车就不管用了,
不信可以试试
whoo 2000-11-05
  • 打赏
  • 举报
回复
try PostMessage
winhelp 2000-11-04
  • 打赏
  • 举报
回复
哈!你肯定在做一个赚钱程序,你用的是和我一样的方法,不过我可以让大家屏幕上任何点击后不产生新的窗口而告诉广告程序有新窗口产生并且在任何环境下不论你是否是在word中,delphi中任何的应用程序中包括任何的对话框中均被广告条认为是在浏览器中工作一直计费正在测试敬请期待。
还有你在遍历窗口查询子窗口时能否解决以下问题?

我在编写一个窗口管理程序,其中当且仅当只有一个已知项即知道父窗口的句柄时(该窗口可能也是别的应用程序产生的,不一定知道它都有些什么样的窗口类型的子窗口控件),需要遍历该窗口中所拥有的全部子窗口,包括具有窗口句柄的控件型的子窗口。

当我用EnumWindows/EnumWindowProc函数或者通过循环用GetWindow/GetChildWindow实现程序时,发现两者实现的结果是相同的(不奇怪)
但奇怪的是,如果在某具有父级关系的窗口中当放入了PageControl页控件时,如果这个控件的多页中某页在自定义函数执行前,尚没有一次被点击显示在最上页时,用以上方法是无法得到该PageControl页控件中子页的窗口句柄的。只有你将所有的子页都点激活一遍以后,再执行我的自定义函数才能通过以上函数找到它。
请问:我如何才能编程实现不需人工激活就可以通过遍历得到如PageControl页的所有子页的控件句柄的?
请问:我如何遍历得到窗口中所有存在的图形的句柄?图形按钮的句柄?菜单项的句柄?
请问:有何种方法可以统一地得到某一窗口中有句柄类型的所有控件的句柄(包括子型窗口、图形、菜单。。。。。。。所有的。?


我的确是用EnumWindows函数和设定给它的回调函数EnumWindowProc,通过循环对进穷举枚举,但的确诸如PageControl或TabControl之类的多页的控件的所有子页中如果没有曾经被激活显示过一次以前,EnumWindows函数是无法找到这类控件的子型控件的窗口的句柄的,系统好象认为不存在其它未被激活的页的。

多谢!
zph 2000-10-06
  • 打赏
  • 举报
回复
把你的例子放出来吧!!!
还有,你是不是在做赚钱程序?
avant 2000-10-05
  • 打赏
  • 举报
回复
if WebBrowser1.Document<>nil then
with WebBrowser1.Application as IOleObject do
Doverb(OleIVERB_UIACTIVATE,nil,nil,0,handle,GetClientRect);
Tommy Chang 2000-09-24
  • 打赏
  • 举报
回复
呵呵,这个问题终于用其它更爽的办法解决了,就是直接操纵里面的dom元素。

anyway,thank for cybercake。

maybe i no more a delpho programmer.

oicq: 1766598
mail: cxgtommy@sina.com
数字蛋糕 2000-09-24
  • 打赏
  • 举报
回复
这里有一个从德国下载的资料。不过我自己也没有试过,不知道有没有帮助。

...den Internet Explorer mit OLE steuern ?

uses comobj;

procedure OpenIE(aURL: string);
var
IE : Variant;
WinHanlde : HWnd;
begin
if( VarIsEmpty(IE) )then
begin
IE := CreateOleObject('InternetExplorer.Application');
IE.Visible := true;
IE.Navigate(aURL);
end
else
begin
WinHanlde := FindWIndow('IEFrame', nil);
if (0 <> WinHanlde) then
begin
IE.Navigate(aURL);
SetForegroundWindow(WinHanlde);
end
else
ShowMessage('Can''t open IE !');
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
OpenIE('http://www.swissdelphicenter.ch');
end;

hubdog 2000-02-19
  • 打赏
  • 举报
回复
hehe,我写了一个程序可以自动点击webbrowser里的超联
实际上这个程序用到了ihtmldocument2的接口
象你那样想简单的通过twebbrowser本身提供的method是不可能的
如果你想要的话,请帮我当几个文件,我连不上去。
如何,愿意的话发mail给我hubdog@263.net
Tommy Chang 2000-02-17
  • 打赏
  • 举报
回复
最初,我只以为用vb写的带datasource控件才不能在delphi中使用,但当实验了几个控件后,发现不同语言写的activex并不象microsoft所说的那么通用,delphi也没有说的完全支持activex那么好.大家都知道没有winapi不能干的事情,没有hook不能跟踪的程序.但不同的开发环境下显然调用的api不同.我这次碰到的这个问题应该是开发环境引起来的.
webbrowser控件第一层是activex容器,第二层activex窗体,最里层应该是view的窗口,而browser中的超链、图片等用findwindowex根本找不到句柄,无法设置焦点。
象vb中对该控件的setfocus会加点东西(虽然不知是什么,但肯定有不同),delphi只是按照activex控件微软定义的接口来调用,自然会少点东西。
从activex的定义上讲,这种东西应该是微软的bug,但如果从vb、vc的角度来看,微软弥补了这种东西。
不管是谁的问题,倒霉的是我们这些所谓的第三方开发人员,没有内核资料,有时还要应付不同厂家产品的兼容问题。
SimonDW 2000-02-16
  • 打赏
  • 举报
回复
activex 控件有不同开发环境所能得到的属性方法不同的特点。
delphi编的控件在vb、vc中也不能使用完全。
delphi自带的activex page中chartfx也不能setfocus。
dnchen 2000-02-14
  • 打赏
  • 举报
回复
Try TEmbedWeb(呵呵,好象是这么写的),他的IE控件里有一个setFocus方法,可以将焦点聚集过来。

不过这么用还是很危险,TWebbrowser本身在Delphi里使用会有内存泄露,所以,很容易造成不稳定,不过,只要你不是动态创建/释放基本问题不是很大。
Lin 2000-02-14
  • 打赏
  • 举报
回复
在Windows环境中,由于多任务的关系,实际上只有活动窗口才能拥有输入焦点。如果想用户点击超链后WebBrowser仍拥有输入焦点,可接管Form的Deactivate事件,即当活动Form失去输入焦点时,再‘抢’回来,如何?
其实WebBrowse只是一个容器,跟Form一样,真正拥有输入焦点的是WebBrowse中的条目,如Link、Edit等。
kxy 2000-02-14
  • 打赏
  • 举报
回复
>>lin的方法可能行
我试过没用:)
Tommy Chang 2000-02-14
  • 打赏
  • 举报
回复
对不起,放假回家,上网条件不好,现在才能有机会回信,首先我暂时没有环境试(要上班才能试),不过lin的方法可能行,但当用户点击超链后,webbrowser可能会失去焦点,不知lin兄可否试过这种情况。至于darkwing兄的办法应该是非常好,但应该都需要使用winapi函数setfocus,我向webbrowser的三层子窗口都用过,但没有效果。这个问题真的不知是ie的bug还是delphi的bug还是其他什么鬼东西,令人头大如斗。
Lin 2000-02-13
  • 打赏
  • 举报
回复
Delphi中,Form有一个公开属性ActiveControl,即可设置Form显示时某个具体拥有输入焦点的控件,将其设置成IE Browser再试试?
Lin 2000-02-13
  • 打赏
  • 举报
回复
Delphi中,Form有一个公开属性ActiveControl,即可设置Form显示时某个具体拥有输入焦点的控件,将其设置成IE Browser在试试?
SimonDW 2000-02-09
  • 打赏
  • 举报
回复
tolewincontrol类的setfocus方法是虚拟的,
需重载。delphi引入webbrowser时未将其基类
引入,setfocus未被重载。
可能要对引入所用pas修改
onion 2000-02-02
  • 打赏
  • 举报
回复
精神可佳,不过要注意身体。
Tommy Chang 2000-02-02
  • 打赏
  • 举报
回复
是的
加载更多回复(10)

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧