流川的Blog

流川的Blog

<2005年10月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

导航

统计

公告

终于有自己的blog啦。不过还不怎么会用。慢慢适应。

留言簿(0)

随笔分类

随笔档案

文章分类

文章档案

vckbase的好友们

搜索

最新评论

  • 1. re: 写一个"实时"定时器
  • 好东西,支持
  • --飞凌
  • 2. re: 无界面程序中使用ActiveX控件完成其功能
  • 好东西,收藏了
  • --配线架
  • 3. re: 我负责的项目进度回顾。
  • XD,你这个太快了吧,PF啊,看你们好象只有2三个人在做事情,一个新项目2个月左右就出了几个版本最后稳定下来真是很难得啊
  • --XC
  • 4. re: 乘错车的后果
  • 呵呵,我也经常坐错车的。有几次朋友来我们这里旅游,我们做错了公车,最后到的地方我也不熟悉了。感觉都很搞笑的呢。
  • --精灵
  • 5. 素衣女服饰
  • --素衣女服饰
  • 6. re: 畸形的中国共享软件产业
  • 你的文章非常精彩,秀逗邀请您加入秀逗博客联盟.中国最大最专业的博客推荐联盟,秀逗博客联盟不截取流量,推荐后的文章指向作者本人的BLOG,文章24小时循环首页展示,真正意义上迅速提升你的博客流量!欢迎注册,注册后将推荐代码添加到自己的BLOG相应位置即可轻松推荐文章,让更多人分享你的文章!后期更有秀逗市场、同心琐秀、商业联盟以及社区陆续登场,更多娱乐功能、商业展示机会,完全免费使用,名人博客,不用再眼红,使用秀逗推荐,流量迅速上升,好的博客,秀逗为您宣传!地址:http://www.sodooo.com
  • --ss
  • 7. re: 畸形的中国共享软件产业
  • 唉~~~~~~~~~~~~....................
  • --freedk
  • 8. re: 畸形的中国共享软件产业
  • 唉~~~~~~~~~~~~....................
  • --freedk
  • 9. re: 软件项目进度的估算
  • 写的很好!
  • --黄道余生
  • 10. re: 畸形的中国共享软件产业
  • 补充: 我的意思是这个问题是社会问题,而并非个人素质或者品德问题。古人云“仓秉实然后知礼节”,老外也有马斯诺五个需求层次之说。如果我们吃、穿、住、用都不能保障(或者要斤斤计较),谈道德、谈素质有点太远了。毕竟这是一个物欲横生的社会,大家又都是俗人。
  • --一笑

阅读排行榜

评论排行榜

2005年10月21日

窗口查找类以及扩展

class CFindWnd {
private:
 //////////////////
 // This private function is used with EnumChildWindows to find the child
 // with a given class name. Returns FALSE if found (to stop enumerating).
 //
 static BOOL CALLBACK FindChildClassHwnd(HWND hwndParent, LPARAM lParam) {
  CFindWnd *pfw = (CFindWnd*)lParam;
  HWND hwnd = FindWindowEx(hwndParent, NULL, pfw->m_classname, NULL);
  if (hwnd) {
   pfw->m_hWnd = hwnd; // found: save it
   return FALSE;   // stop enumerating
  }
  EnumChildWindows(hwndParent, FindChildClassHwnd, lParam); // recurse
  return TRUE;    // keep looking
 }

public:
 LPCSTR m_classname;   // class name to look for
 HWND m_hWnd;     // HWND if found

 // ctor does the work--just instantiate and go
 CFindWnd(HWND hwndParent, LPCSTR classname)
  : m_hWnd(NULL), m_classname(classname)
 {
  FindChildClassHwnd(hwndParent, (LPARAM)this);
 }
};

该类来自于MSDN Magazine -- August 2003。
用法:CFindWnd fw(hwndParent,classname);
fw.m_hWnd就是你要找到的窗口句柄。如果目标窗口是顶层窗口,则hwndParent填为NULL.

某些情况下,如果说你要找到一个对话框框中的密码框,那么该对话框中可能有多个Edit。
用该类显然不能满足要求。
很多情况下,我们要找到一个对话框中的所有Edit,怎么办呢?
因此,我按照他的思想,来定制了一个类。


#include <vector>
using namespace std;
class CFindWndEx {
private:
 //////////////////
 // This private function is used with EnumChildWindows to find the child
 // with a given class name. Returns FALSE if found (to stop enumerating).
 //
 static BOOL CALLBACK FindChildClassHwnd(HWND hwndParent, LPARAM lParam)
 {
  CFindWndEx *pfw = (CFindWndEx*)lParam;

  //判断该窗口
        char sClassName[1024]={0};
  ::GetClassName(hwndParent,sClassName,sizeof(sClassName)-1);
  if(strcmp(sClassName,pfw->m_classname)==0)
  {//本窗口!
   pfw->m_listWnd.push_back(hwndParent);
  }

  HWND hwnd = ::GetWindow(hwndParent,GW_CHILD);//第一个子窗口
  while(hwnd)
  {

   if(::GetWindow(hwnd,GW_CHILD))
   {//如果具有子窗口
    FindChildClassHwnd(hwnd, lParam); // 递归到该窗口下所有窗口
   }
   else
   {//如果非子窗口
    ::GetClassName(hwnd,sClassName,sizeof(sClassName)-1);
    if(strcmp(sClassName,pfw->m_classname)==0)
    {//该窗口!
     pfw->m_listWnd.push_back(hwnd);
    }
   }

   hwnd = ::GetWindow(hwnd,GW_HWNDNEXT);//下一个子窗口
  }


  return TRUE;    // keep looking
 }
public:
 vector<HWND> m_listWnd;
public:
 LPCSTR m_classname;   // class name to look for
 HWND m_hWnd;     // HWND if found

 // ctor does the work--just instantiate and go
 CFindWndEx(HWND hwndParent, LPCSTR classname)
  : m_hWnd(NULL), m_classname(classname)
 {
  m_listWnd.clear();

  if(!hwndParent)
  {//所有顶层窗口
   HWND hwnd = ::FindWindow(m_classname,NULL);//第一个子窗口
   while(hwnd)
   {
    FindChildClassHwnd(hwnd, (LPARAM)this);

    hwnd=::GetWindow(hwnd,GW_HWNDNEXT);
   }

  }
  else
  {
   FindChildClassHwnd(hwndParent, (LPARAM)this);
  }

       
  TRACE("Start=======================>\n");
  int nWndCount=m_listWnd.size();
  for(int n=0;n<nWndCount;n++)
  {
   TRACE("Index:%d\tHWND:%x\n",n,m_listWnd[n]);
  }
  TRACE("End=========================>\n");

 }
};

用法:CFindWnd fw(hwndParent,classname);
fw.m_listWnd就是目标的所有窗口列表。
如果你要得到密码框,你可以遍历,一个一个取属性后得到。

如果有任何疑问,欢迎指出。

发表于 2005-10-21 14:49 liuchuan的Blog 阅读(1828) | 评论 (0)编辑 收藏