分享

根据进程ID枚举所有窗口获得窗口句柄

 @IT小小鸟@ 2012-02-28

根据进程ID枚举所有窗口获得窗口句柄

查找资料后整理如下

  1. /******************************************************************** 
  2.     created:    2010/03/09 
  3.     created:    9:3:2010   10:03 
  4.     file base:  CWindowIterator 
  5.     file ext:   h 
  6.     author:     zhangwf 
  7.      
  8.     purpose:    封装枚举窗口类 
  9. *********************************************************************/  
  10. #ifndef _CWINDOW_ITERATOR_ZWF_H_  
  11. #define _CWINDOW_ITERATOR_ZWF_H_  
  12. //////////////////////////////////////////////////////////////////////////  
  13. #include <vector>  
  14. using namespace std;  
  15. //////////////////////////////////////////////////////////////////////////  
  16. class CWindowIterator  
  17. {  
  18. public:  
  19.     // 构造析构函数  
  20.     CWindowIterator();  
  21.     ~CWindowIterator();  
  22.   
  23. public:  
  24.     // 接口函数  
  25.     void EnumWnds();                        // 枚举窗口  
  26.     unsigned long GetWndCounts();           // 获得窗口总数  
  27.     HWND First();                           // 获得第一个窗口句柄  
  28.     HWND Next();                            // 获得下一个窗口句柄  
  29.     HWND GetHWnd(unsigned long wndIndex);   // 根据索引获得窗口句柄         
  30.   
  31. protected:  
  32.     vector<HWND> m_hWndArray;               // 存放枚举得到的窗口句柄  
  33.     unsigned long m_nCurrentWndIndex;       // 当前窗口句柄  
  34.   
  35.     // 枚举窗口回调函数  
  36.     static BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lp);  
  37.   
  38.     // virtual enumerator  
  39.     virtual BOOL AddWnd(HWND hwnd);  
  40.   
  41.     // override to filter different kinds of windows  
  42.     virtual BOOL IsTargetWnd(HWND hwnd) {return TRUE;}  
  43.   
  44. };  
  45. //////////////////////////////////////////////////////////////////////////  
  46. //////////////////////////////////////////////////////////////////////////  
  47. // 派生出主窗口类(只获取进程的主窗口)  
  48. class CMainHWnd : public CWindowIterator  
  49. {  
  50. public:  
  51.     // 构造析构函数  
  52.     CMainHWnd();  
  53.     CMainHWnd(unsigned long pid);  
  54.     ~CMainHWnd();  
  55.   
  56. public:  
  57.     // 接口函数  
  58.     void EnumWndsByPid(DWORD pid);  
  59.   
  60. protected:  
  61.     DWORD m_pid;  
  62.     virtual BOOL IsTargetWnd(HWND hwnd);  
  63.   
  64. };  
  65. //////////////////////////////////////////////////////////////////////////  
  66. #endif  

源文件

  1. /******************************************************************** 
  2.     created:    2010/03/09 
  3.     created:    9:3:2010   10:10 
  4.     file base:  CWindowIterator 
  5.     file ext:   cpp 
  6.     author:     zhangwf 
  7.      
  8.     purpose:    封装枚举窗口类 
  9. *********************************************************************/  
  10. //////////////////////////////////////////////////////////////////////////  
  11. #include <Windows.h>  
  12. #include "CWindowIterator.h"  
  13. //////////////////////////////////////////////////////////////////////////  
  14. // 构造函数  
  15. CWindowIterator::CWindowIterator()  
  16. {  
  17.     // 初始化变量  
  18.     m_hWndArray.clear();  
  19.     m_nCurrentWndIndex = 0;  
  20. }  
  21.   
  22. // 析构函数  
  23. CWindowIterator::~CWindowIterator()  
  24. {  
  25.   
  26. }  
  27.   
  28. //////////////////////////////////////////////////////////////////////////  
  29. // 接口函数  
  30. // 获得窗口总数  
  31. unsigned long CWindowIterator::GetWndCounts()  
  32. {  
  33.     return m_hWndArray.size();  
  34. }  
  35.   
  36. // 获得第一个窗口句柄  
  37. HWND CWindowIterator::First()  
  38. {  
  39.     if (m_hWndArray.size() != 0)  
  40.     {  
  41.         m_nCurrentWndIndex = 0;  
  42.         return m_hWndArray[m_nCurrentWndIndex];  
  43.     }  
  44.   
  45.     return NULL;  
  46. }  
  47.   
  48. // 获得下一个窗口句柄  
  49. HWND CWindowIterator::Next()  
  50. {  
  51.     if (m_nCurrentWndIndex+1 < m_hWndArray.size())  
  52.     {  
  53.         m_nCurrentWndIndex += 1;  
  54.         return m_hWndArray[m_nCurrentWndIndex];  
  55.     }  
  56.   
  57.     return NULL;  
  58. }  
  59.   
  60. // 根据索引获得窗口句柄  
  61. HWND CWindowIterator::GetHWnd(unsigned long wndIndex)  
  62. {  
  63.     if (wndIndex < m_hWndArray.size())  
  64.     {  
  65.         return m_hWndArray[wndIndex];  
  66.     }  
  67.   
  68.     return NULL;  
  69. }  
  70.   
  71. void CWindowIterator::EnumWnds()  
  72. {  
  73.     // 清除上次内容  
  74.     m_hWndArray.clear();  
  75.   
  76.     // 枚举所有窗口  
  77.     ::EnumWindows(EnumWndProc, (LPARAM)this);  
  78. }  
  79.   
  80. //////////////////////////////////////////////////////////////////////////  
  81. // 非接口函数  
  82. // 枚举窗口回调函数  
  83. BOOL CALLBACK CWindowIterator::EnumWndProc(HWND hwnd, LPARAM lp)  
  84. {  
  85.     return ((CWindowIterator*)lp)->AddWnd(hwnd);  
  86. }  
  87.   
  88. // virtual enumerator  
  89. BOOL CWindowIterator::AddWnd(HWND hwnd)  
  90. {  
  91.     if (IsTargetWnd(hwnd) == TRUE)  
  92.     {  
  93.         m_hWndArray.push_back(hwnd);          
  94.     }  
  95.   
  96.     return TRUE;  
  97. }  
  98. //////////////////////////////////////////////////////////////////////////  
  99. //////////////////////////////////////////////////////////////////////////  
  100. // 派生出主窗口句柄类  
  101. // 构造函数  
  102. CMainHWnd::CMainHWnd()  
  103. :CWindowIterator()  
  104. {  
  105.     m_pid = 0;  
  106. }  
  107.   
  108. // 带参构造函数  
  109. CMainHWnd::CMainHWnd(unsigned long pid)  
  110. :CWindowIterator()  
  111. {  
  112.     m_pid = pid;  
  113.     EnumWnds();  
  114. }  
  115.   
  116. // 析构函数  
  117. CMainHWnd::~CMainHWnd()  
  118. {  
  119.   
  120. }  
  121.   
  122. //////////////////////////////////////////////////////////////////////////  
  123. // 接口函数  
  124. void CMainHWnd::EnumWndsByPid(DWORD pid)  
  125. {  
  126.     m_pid = pid;  
  127.     EnumWnds();  
  128. }  
  129. //////////////////////////////////////////////////////////////////////////  
  130. // 非接口函数  
  131. BOOL CMainHWnd::IsTargetWnd(HWND hwnd)  
  132. {  
  133.     // 顶层且可见  
  134.     if (::GetParent(hwnd)==NULL && ::IsWindowVisible(hwnd)==TRUE)   
  135.     {         
  136.         DWORD pidwin;  
  137.         ::GetWindowThreadProcessId(hwnd, &pidwin);  
  138.         if (pidwin == m_pid)  
  139.         {  
  140.               
  141.             return TRUE;  
  142.         }             
  143.     }  
  144.   
  145.     // 不是目标窗口  
  146.     return FALSE;  
  147. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多