CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

请问各位大侠,如果遍历一个进程窗口中所有的控件的类名?

楼主yunboddd(云波)2005-02-01 11:48:05 在 VC/MFC / 基础类 提问

我想获得进程中的Internet   Explorer_Server的hwnd,但它的父类是一个不确定的类名,如Afx:1640000:b:10011:1900010:0这样的东西。是否可以像spy++那样列出具体一个进程窗口所有控件的类来得到Internet   Explorer_Server的hwnd?但小弟初学不太懂API,各位大侠是否可以指教一二?万分感谢! 问题点数:100、回复次数:11Top

1 楼microyzy(人不在牛,分高就行;分不在高,人牛也行)回复于 2005-02-01 12:19:41 得分 50

获得窗口控件使用EnumChildWindows,看msdn吧  
  不过它不能获得ie窗口里的控件,这个需要调用ie提供的自动化接口,网上有很多这类文章,我   看看我这里有没有代码。。。Top

2 楼microyzy(人不在牛,分高就行;分不在高,人牛也行)回复于 2005-02-01 12:25:50 得分 0

IE窗口的类名应该是这个:Internet   Explorer_ServerTop

3 楼microyzy(人不在牛,分高就行;分不在高,人牛也行)回复于 2005-02-01 12:27:56 得分 0

楼主将就着看,不然就到google上搜索吧,别人的可能比我的清楚的多,呵呵  
  //获取IE文档的对象  
  HINSTANCE   hInst   =NULL;  
  LPFNOBJECTFROMLRESULT   pfObjectFromLresult=NULL;  
  HRESULT   hr;  
  CComPtr<IHTMLDocument2>   spDoc;  
  CComPtr<IDispatch>   spDisp;  
  CComPtr<IDispatch>   spDisp2;  
  CComPtr<IDispatch>   spDisp3;  
  CComQIPtr<IHTMLWindow2>   spWin;  
  CComPtr<IHTMLElementCollection>   pElements;  
  CComPtr<IHTMLElementCollection>   pEdits;  
  CComPtr<IHTMLInputTextElement>   pEdit;  
  CComVariant   iname="pr";//文本框名称  
  CComVariant   index=0;  
  CComBSTR   bstr1;  
  LRESULT   lRes=0;  
  int   iToDo;//要求的总数  
  int   iFound=0;//发现的总数  
  BOOL   bInteger=FALSE;//要不要整数  
  int   iCurrent;//当前值(10倍)  
  int   fInterval;//每次增减的量,用正负号表示  
  int   i=0;  
  char   stmp[256];  
  UINT   nMsg   =   ::RegisterWindowMessage("WM_HTML_GETOBJECT");  
   
  bInteger=!IsDlgButtonChecked(IDC_CHECK1);  
  GetDlgItem(IDC_EDIT1)->GetWindowText(stmp,sizeof(stmp));  
  iCurrent=(int)(atof(stmp)*10);  
  if(IsDlgButtonChecked(IDC_CHECK2))  
  fInterval=-1;  
  else  
  fInterval=1;  
   
  ::SendMessageTimeout(hIECTL,nMsg,   0L,   0L,SMTO_ABORTIFHUNG,1000,(DWORD*)&lRes);  
  hInst   =   ::LoadLibrary("OLEACC.DLL");  
  if(!hInst)  
  goto   err_com;  
  pfObjectFromLresult=(LPFNOBJECTFROMLRESULT)::GetProcAddress(hInst,"ObjectFromLresult");  
  if(!pfObjectFromLresult)  
  goto   err_dll;  
   
  hr   =   pfObjectFromLresult(lRes,IID_IHTMLDocument,0,(void**)&spDoc   );  
  if   (FAILED(hr))  
  goto   err_dll;  
  spDoc->get_Script(   &spDisp   );  
  spWin   =   spDisp;  
  spWin->get_document(   &spDoc.p);  
  //可以开始控制网页  
  //spDoc->put_bgColor(CComVariant("red"));  
  //查找文本输入框,并自动填充数字  
  //所有的文本框名字均叫“pr”  
  if(FAILED(spDoc->get_all(&pElements)))  
  goto   err_dll;  
  while(TRUE)  
  {  
  hr=pElements->item(iname,index,(IDispatch**)&spDisp2);  
  if(SUCCEEDED(hr)   &&   spDisp2)  
  {  
  hr=spDisp2->QueryInterface(IID_IHTMLInputTextElement,(void**)&pEdit);  
  if(SUCCEEDED(hr)   &&   pEdit)  
  {  
  pEdit->get_type(&bstr1);  
  if(bstr1==_T("text"))//找到一个text  
  {  
  iFound++;  
  if(iFound<=iToDo)  
  {  
  //是否是整数  
  if(!bInteger)  
  {  
  if(iCurrent/10*10==iCurrent)  
  iCurrent+=fInterval;  
  }  
  char   snum[64];  
  sprintf(snum,"%.1f",((double)iCurrent/10));  
  CComBSTR   b1=snum;  
  pEdit->put_value(b1);  
  iCurrent+=fInterval;  
  }  
  else  
  {  
  CComBSTR   b1="";  
  pEdit->put_value(b1);  
  }  
  }  
  pEdit.Detach();  
  }  
  }  
  else  
  break;  
  index.intVal+=1;    
  spDisp2.Detach();  
  }  
  if(iFound<=0)  
  MessageBox("NOT   found!");  
  else  
  MessageBox("OK!");Top

4 楼yunboddd(云波)回复于 2005-02-01 13:44:51 得分 0

谢谢你!  
  不过大哥   我只要得到Internet   Explorer_Server的hwnd即可,网页中的控件暂时还搞不上Top

5 楼kingzai(stevenzhu)回复于 2005-02-01 13:57:52 得分 50

you   can   use   EnumWindows   to   get   all   IE   window,then   call  
  BOOL   CALLBACK   EnumChildProc(HWND   hwnd,LPARAM   lParam)  
  {  
  TCHAR buf[100];  
  CString strhwnd;  
   
  ::GetClassName(   hwnd,   (LPTSTR)&buf,   100   );  
  if   (   _tcscmp(   buf,   _T("Internet   Explorer_Server")   )   ==   0   )  
  {  
  *(HWND*)lParam   =   hwnd;  
  return   FALSE;  
  }  
  else  
  return   TRUE;  
  };  
  Top

6 楼yunboddd(云波)回复于 2005-02-01 16:04:48 得分 0

大哥,不是IE,IE的话我就不用这么费劲了  
   
   
  是嵌入在父类是一个不确定的类名,如Afx:1640000:b:10011:1900010:0里的Top

7 楼legendhui(秋天的叶子)回复于 2005-02-01 16:07:23 得分 0

EnumChildWindowsTop

8 楼kwiner(ak.net)回复于 2005-02-02 11:46:14 得分 0

FindWindowExTop

9 楼microyzy(人不在牛,分高就行;分不在高,人牛也行)回复于 2005-02-02 13:44:02 得分 0

你的意思是不是说在窗口里面有IE控件,你想得到IE控件的句柄?  
  如果是,那就用EnumChildWindows,得到每个控件的hwnd后,获取它的classname,然后就知道这个控件是不是IE控件了  
   
  只要是固定的控件,肯定会有固定的类名,你还不如直接告诉大家你想找什么东西,也许这个现象:  
  “是嵌入在父类是一个不确定的类名,如Afx:1640000:b:10011:1900010:0里的”  
  迷惑了你Top

10 楼microyzy(人不在牛,分高就行;分不在高,人牛也行)回复于 2005-02-02 13:45:28 得分 0

也迷惑了大家。。。Top

11 楼yunboddd(云波)回复于 2005-02-02 20:56:02 得分 0

...小弟比较菜~     谢谢microyzy(毛毛叉)的分析,及   kingzai(stevenzhu)的代码Top

相关问题

  • 请问各位大侠,如果遍历一个进程窗口中所有的控件的类名?
  • 如何遍历外部进程中的控件
  • 如何遍历外部进程中的控件
  • 请问如何对一组同类控件进行遍历?
  • 如何遍历树控件?
  • 遍历控件问题
  • 遍历控件的问题.
  • 遍历控件问题?
  • 有关treeview控件的遍历问题
  • 树控件遍历问题??急!!!

关键词

  • 控件
  • idc
  • hr
  • ie
  • dll
  • server
  • pfobjectfromlresult
  • ccomptr
  • spdisp
  • finterval

得分解答快速导航

  • 帖主:yunboddd
  • microyzy
  • kingzai

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo