枚举当前打开的所有窗口

转载 2008年04月27日 21:41:00
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

一、原理
     其原理是利用GetWindowLong(hWnd,GWL_STYLE)& WS_VISIBLE对打开的窗口进行查找,并将窗口的句柄存放在一个HWND的数组中,结合EnumWindows进行窗口的枚举,从而得到响应的窗口名称;
二、主要函数介绍:
   BOOL EnumWindows(
  WNDENUMPROC lpEnumFunc,  // callback function
  LPARAM lParam            // application-defined value
);
LONG GetWindowLong(
  HWND hWnd,  // handle to window
  int nIndex  // offset of value to retrieve
);
详细资料请查看MSDN;
在此我定义了一个过程EnumWindowsProc,通过GetWindowLong来完成对打开程序窗口的枚举;通过ListBox实现程序的列举;并将每次调用的枚举结果存放在/info目录下当天日期为文件名称的.txt文件里;

四、主要实现代码:

初始化部分(全局):

HWND hwnd;
HWND m_hwndFind[100] = { NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
int m_num = 0 ;
TCHAR m_store[MAX_PATH];
TCHAR m_name[MAX_PATH];
TCHAR m_strClass[MAX_PATH];
TCHAR m_FilePath[MAX_PATH];
TCHAR m_FileName[24];

 

枚举处理的代码:

 

 CTime year,day,month,hour,minute,second;
 CStdioFile fp;
 CTime current = CTime::GetCurrentTime();
 year = current.GetYear();
 month = current.GetMonth();
 day = current.GetDay();
 sprintf(m_FileName,"%4d%02d%02d.txt",year,month,day);
 
 ::GetModuleFileName(NULL,m_FilePath,MAX_PATH);
 (_tcsrchr(m_FilePath,'/'))[1] = 0;
 //sprintf(m_FileName,"info%d.txt",rand());
 strcat(m_FilePath,"info/");
 try
 {
  ::CreateDirectory(m_FilePath,NULL);
 }
 catch(...)
 {}
 try
 {
  ::SetCurrentDirectory(m_FilePath);
 }
 catch(...)
 {}
 strcat(m_FilePath,m_FileName);
 if((fp.Open(m_FilePath,CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite))==0)
  return;
 CButton *button = (CButton*)GetDlgItem(IDC_BTN_START);
 if(button)
 {
  button->EnableWindow(FALSE);
 }
 //enable RESET button
 CButton *button2 = (CButton *)GetDlgItem(IDC_BTN_RESET);
 if(button2)
 {
  button2->EnableWindow(TRUE);
 }
 //enumerate windows by EnumWindowProc function
 ::EnumWindows(CEmuteWindowsDlg::EnumWindowsProc,NULL);
 //add the title of the window in ListBox
 for(int i = 0;i <=m_num;i++)
 {
  HWND m_wnd = m_hwndFind[i];
  ::GetWindowText(m_wnd,m_store,128);
  ::GetClassName(m_wnd,m_strClass,MAX_PATH-1);
  /*   if(!lstrcmpi(m_strClass, _T("Notepad")))
  ::PostMessage(m_wnd,WM_CLOSE,0,0);*/
  HWND hWnd;
  UINT nIdFirst;
  TCHAR szBuf[MAX_PATH];
  
  hWnd=::GetWindow(m_wnd,GW_CHILD); 
  
  if(hWnd == NULL || !::IsWindow(hWnd))
   return ;
  
  nIdFirst=::GetDlgCtrlID(hWnd);
  
  do
  {
   GetClassName(hWnd,szBuf,MAX_PATH);  
   
   //etc
   
   hWnd=::GetWindow(hWnd,GW_HWNDNEXT);
   if(!::IsWindow(hWnd) || hWnd==NULL)
    break;
   
  }while(nIdFirst != ::GetDlgCtrlID(hWnd));
  
  
  sprintf(m_name,"(%d)标题名称:",i);
  strcat(m_name,m_store);
  strcat(m_name,"      类名称:");
  strcat(m_name,m_strClass);
  m_strList.AddString(m_name);
  fp.SeekToEnd();
  fp.WriteString(m_name);
  fp.WriteString("");
 }
 fp.SeekToEnd();
 fp.WriteString("");
 hour = current.GetHour();
 minute=current.GetMinute();
 second = current.GetSecond();
 sprintf(m_FilePath,"********************%02d时%02d分%02d秒写入***********************",hour,minute,second);
 fp.WriteString(m_FilePath);
 fp.WriteString("");
 fp.Close();

 

重新枚举处理:

 CButton *button  = (CButton *)GetDlgItem(IDC_BTN_START);
 if(button)
 {
  button->EnableWindow(TRUE);
 }
 //disable RESET button
 CButton *button2  = (CButton *)GetDlgItem(IDC_BTN_RESET);
 if(button2)
 {
  button2->EnableWindow(FALSE);
 }
 m_strList.ResetContent();//reset the ListBox content
 m_num = 0;//reset the count 

 

枚举窗口句柄的函数:

在头文件中声明为:

static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);

实现部分:

BOOL CEmuteWindowsDlg::EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
 //be sure the current window is visible
 if(::GetWindowLong(hWnd,GWL_STYLE)& WS_VISIBLE)
 {
  m_hwndFind[m_num] = hWnd;//record the HWND handle into array
  m_num++;//count start
 }
 return 1;
}

调试环境:

win2000 adv server + vc6.0 + vsp5.0

 

 

 

 

 

 

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

到底什么才是合理的管理?

  看了尧曰转载的《一个人事经理眼中的中国人劣根性》,再看了火炬的《驳斥一下:一个人事经理眼中的中国人劣根性》,然后再看看Feedback,有提到了合理的管理。于是我在想,到底什么是合理的管理?  我...
  • foxfly
  • foxfly
  • 2004-05-27 10:44:00
  • 1691

VC++MFC 枚举当前打开的所有窗口

1.头文件中定义static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);2.声明一些用的东西HWND hWnd;HWND m_hw...
  • ice197983
  • ice197983
  • 2007-03-21 11:04:00
  • 2954

用EnumWindows枚举当前所有已打开窗口标题栏名称

  • 2012年02月05日 22:27
  • 1KB
  • 下载

VC++进行窗口枚举

借鉴内容来自VC++驿站:VC驿站 ①、使用 GetWindow 进行窗口枚举: This function retrieves the handle to a window that has...
  • u012372584
  • u012372584
  • 2016-12-19 10:13:11
  • 974

<em>枚举当前所有</em>窗口

能够列出<em>当前</em>打开的<em>所有</em>窗口的相关信息,包括:窗口标题,窗口类名,窗口句柄,窗口...上传者: chchange 时间: 2009-04-<em>23</em> 综合评分: 3 积分/<em>C</em>币:3 V<em>C枚举</em>系统...
  • 2018年04月17日 00:00

枚举当前打开的所有窗口

  • zgqtxwd
  • zgqtxwd
  • 2008-04-27 21:41:00
  • 197

枚举窗口

// tt.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include BOOL CALLBACK EnumWindo...
  • liujiayu2
  • liujiayu2
  • 2014-11-21 12:19:18
  • 393

枚举窗口及其应用

枚举窗口及其应用示例代码下载:枚举窗口及其应用(请不要直接使用迅雷下载)1.下面请看几种枚举窗口的方式一:利用GetWindow(ParentWnd, GW_CHILD);void FindAllCh...
  • jacky_qiu
  • jacky_qiu
  • 2010-11-04 21:58:00
  • 3599

MDI环境下枚举所有打开的窗口

In MFC, each CMDIChildWnd created by the framework is managed as a child window of the MDIClient win...
  • lggrief
  • lggrief
  • 2016-10-12 14:44:09
  • 287

窗口枚举

窗口枚举: EnumWindows: EnumWindows只能枚举顶级窗口,需要递归调用EnumChildWindows才能获得进程的所有窗口。 EnumDesktopWindows:...
  • wangxvfeng101
  • wangxvfeng101
  • 2014-07-28 14:34:03
  • 885
收藏助手
不良信息举报
您举报文章:枚举当前打开的所有窗口
举报原因:
原因补充:

(最多只允许输入30个字)