如何用BHO获取当前浏览网页的某个控件的坐标? 50分

snmhm1991 2012-03-30 01:46:41
怎么获取当前网页中某个按钮或者其他控件、元素的位置呢?或许这里所说的一个按钮在网页中其实就是一张图片而已,如何获取此时控件的位置?
...全文
231 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
stunix 2014-10-11
  • 打赏
  • 举报
回复
有frame的情况下怎么获取元素的屏幕坐标呢
panqw001 2013-12-03
  • 打赏
  • 举报
回复
受益不小
snmhm1991 2012-03-30
  • 打赏
  • 举报
回复
接下来还有一个问题摆在我的面前就是我想使这个获得的坐标转化为相对于IE8,IE9中某一个Tab的相对坐标。或许当前这个元素不在当前Tab的视图范围内,但是我要获取只要元素只要出现在Tab中就获取其相对于Tab的相对坐标,再接再历。。。不知道是不是已经有人这么做过了?
snmhm1991 2012-03-30
  • 打赏
  • 举报
回复
问题解决了,现在贴上自己的代码如果有相同问题的朋友可以参考下:

POINT CFloatWnd::GetElemPoint(CString ElemID){ //这里的ElemID是网页中元素(控件的ID),可以通过VS2010打开网页的源码然后用VS2010编译一次就可以获取它的ID号,然后在这里可以直接以CString传递进来

POINT point; //存放元素坐标
HRESULT hr=NULL;
CComPtr<IDispatch> pDisp;
CComPtr<IHTMLDocument2> pDoc;// 必须要添加 #include <mshtml.h> 头文件
IHTMLElementCollection* pColl=NULL;

hr=mWebBrowser2->get_Document(&pDisp);

pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);

pDoc->get_all(&pColl);
CComPtr<IDispatch> pDisp2;

VARIANT index;
VARIANT ID;
V_VT(&index)=VT_I4;
V_I4(&index)=0;
ID=StringToVariant(ElemID); //通过VS2010打开HTML文件或者网页源代码获取ID

hr=pColl->item(ID,index,&pDisp2); //获取指定ID的元素

if(hr==S_OK && pDisp2!=NULL){
CComPtr<IHTMLElement> pElem;
hr=pDisp2->QueryInterface(IID_IHTMLElement,(void**)&pElem);
if(hr==S_OK && pElem!=NULL){
long top=0;
long left=0;
long width=0;
long height=0;
long value=0;
IHTMLElement* hContainer=NULL;
pElem->get_offsetTop(&top); //获取顶部位置 (获取的是相对于父节点的相对坐标)
pElem->get_offsetLeft(&left);
pElem->get_offsetWidth(&width); //获取顶部位置
pElem->get_offsetHeight(&height);
hr=pElem->get_offsetParent(&hContainer); //其真实坐标应该是所有的父结点的坐标的叠加,所以有以下循环
while ( hContainer )
{
hContainer->get_offsetLeft(&value);
left += value;
hContainer->get_offsetTop(&value);
top += value;
hContainer->get_offsetParent(&hContainer);
}
point.x=left;
point.y=top;
//-----------------------获取到元素后就可以对该元素进行操作了---------------------------
//-------如下:

WCHAR* title;
pElem->get_title(&title); //成功获取按钮

USES_CONVERSION;
CString Title=W2A(title);
CString Msg;
Msg.Format("top:%ld,left:%ld,width:%ld,height:%ld",top,left,width,height);

if(hContainer!=NULL)
hContainer->Release(); //此时由于上面的循环hContainer已经为0了
// AfxMessageBox(Title+" "+Msg);
// pElem->Release(); //智能指针不用释放,也不能直接释放
}
}
pColl->Release(); //释放所有接口
return point;
}

VARIANT StringToVariant(CString str){ //CString转VARIANT
VARIANT variant;
VariantInit(&variant);
variant.vt=VT_BSTR;
variant.bstrVal=str.AllocSysString();
return variant;
}
fishion 2012-03-30
  • 打赏
  • 举报
回复
如果能得到IHTMLDocument2接口的话,再得到那个控件的IHTMLElement 接口,然后就能使用这个接口的offsetLeft,offsetTop,offsetWidth,offsetHeight来得到控件的坐标了

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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