• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: 小 中 大 | 推荐给好友 上一篇 | 下一篇

在CTreeCtrl中枚举系统中的所有窗口

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 11次 | 进入软件测试论坛讨论

领测软件测试网

本文将给出一个源程序,实现在一个对话框中的TreeCtrl中用树的形式枚举窗口。
 
这是头文件 
 
// WinList.h : header file 
// 
 
 
/////////////////////////////////////////////////////////////////////////////
 
// CWinList dialog 
 
class CWinList : public CDialog 
{ 
// Construction 
public: 
HWND m_hSelected; 
CWinList(CWnd* pParent = NULL); // standard constructor 
static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam); 
static BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam); 
void BuiltTree(HWND hWnd); 
 
// Dialog Data 
//{{AFX_DATA(CWinList) 
enum { IDD = ID_WINLIST }; 
CTreeCtrl m_Tree; 
//}}AFX_DATA 
 
 
// Overrides 
// ClassWizard generated virtual function overrides 
//{{AFX_VIRTUAL(CWinList) 
public: 
virtual BOOL DestroyWindow(); 
protected: 
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV
support 
//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
void DrawFlash(HWND hWnd); 
void Refresh(); 
 
// Generated message map functions 
//{{AFX_MSG(CWinList) 
virtual BOOL OnInitDialog(); 
afx_msg void OnRefresh(); 
afx_msg void OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult); 
//}}AFX_MSG 
DECLARE_MESSAGE_MAP() 
private: 
CFont TreeFont; 
TV_INSERTSTRUCT TreeItem; 
int RootPt; 
HTREEITEM RootArray[10]; 
}; 
 
 
 
下面是实现文件 
 
// WinList.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "mfc.h" 
#include "WinList.h" 
#include "mfcApi.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
 
/////////////////////////////////////////////////////////////////////////////
 
// CWinList dialog 
 
 
CWinList::CWinList(CWnd* pParent /*=NULL*/) 
: CDialog(CWinList::IDD, pParent) 
{ 
//{{AFX_DATA_INIT(CWinList) 
// NOTE: the ClassWizard will add member initialization
here 
//}}AFX_DATA_INIT 
} 
 
 
void CWinList::DoDataExchange(CDataExchange* pDX) 
{ 
CDialog::DoDataExchange(pDX); 
//{{AFX_DATA_MAP(CWinList) 
DDX_Control(pDX, IDTREE, m_Tree); 
//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CWinList, CDialog) 
//{{AFX_MSG_MAP(CWinList) 
ON_BN_CLICKED(IDREFRESH, OnRefresh) 
ON_NOTIFY(TVN_SELCHANGED, IDTREE, OnSelchangedTree) 
//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
 
/////////////////////////////////////////////////////////////////////////////
 
// CWinList message handlers 
 
static CDWordArray WinArray; 
static unsigned long Level; 
static int Ignore[10]; 
static HWND hPrevWnd; 
 
BOOL CALLBACK CWinList::EnumChildProc(HWND hwnd,LPARAM lParam) 
{ 
Ignore[Level]++; 
if (Ignore[Level+1]) Ignore[Level+1]--; 
else 
{ WinArray.Add((unsigned long)((Level<<16)|(unsigned
long)hwnd)); 
Level++;Ignore[Level+1]=0; 
EnumChildWindows(hwnd,EnumChildProc,(long)0); 
Level--; 
} 
 
return TRUE; 
} 
 
BOOL CALLBACK CWinList::EnumWindowsProc(HWND hwnd, LPARAM lParam) 
{ 
WinArray.Add((unsigned long)hwnd); 
Level=1;Ignore[Level+1]=0; 
EnumChildWindows(hwnd,EnumChildProc,(long)0); 
return TRUE; 
} 
 
void CWinList::BuiltTree(HWND hWnd) 
{ char Temp[90]; 
char Text[50]; 
char Name[20]; 
 
TreeItem.hParent=RootArray[RootPt]; 
 
::GetWindowText(hWnd,Text,50); 
::GetClassName(hWnd,Name,20); 
sprintf(Temp,"[%04x]:{%s}:%s",hWnd,Name,Text); 
TreeItem.item.pszText=Temp; 
TreeItem.item.lParam=(unsigned long)hWnd; 
HTREEITEM TempItem=m_Tree.InsertItem(&TreeItem); 
RootArray[RootPt+1]=TempItem; 
} 
 
void CWinList::DrawFlash(HWND hWnd) 
{ 
HDC hDC; 
RECT rc; 
HPEN hPen; 
 
::GetWindowRect(hWnd, &rc); 
hDC=::GetWindowDC(hWnd); 
::SetROP2(hDC,R2_NOT); 
 
hPen=::CreatePen(PS_INSIDEFRAME,5*GetSystemMetrics(SM_CXBORDER),RGB(255,0,0))
; 
::SelectObject(hDC,hPen); 
::SelectObject(hDC,GetStockObject(NULL_BRUSH)); 
::Rectangle(hDC,0,0,rc.right-rc.left,rc.bottom-rc.top); 
::ReleaseDC(hWnd,hDC); 
::DeleteObject(hPen); 
} 
 
void CWinList::Refresh() 
{ RootArray[0]=TVI_ROOT; 
RootPt=0; 
 
TreeItem.hInsertAfter=TVI_LAST; 
TreeItem.item.mask=TVIF_TEXT|TVIF_PARAM; 
WinArray.RemoveAll(); 
m_Tree.SetFont(&TreeFont); 
m_Tree.DeleteAllItems(); 
Level=0; 
for(int j=0;j<10;j++) Ignore[j]=0; 
EnumWindows(EnumWindowsProc,(long)0); 
 
for(int i=0;i/td>
{ RootPt=(int)((WinArray[i]&0xFFFF0000)>>16); 
BuiltTree((HWND)(WinArray[i]&0x0000FFFF)); 
} 
} 
 
BOOL CWinList::OnInitDialog() 
{ 
CDialog::OnInitDialog(); 
 
// TODO: Add extra initialization here 
m_hSelected=NULL; 
hPrevWnd=NULL; 
Refresh(); 
return TRUE; // return TRUE unless you set the focus to a control 
// EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void CWinList::OnRefresh() 
{ 
// TODO: Add your control notification handler code here 
Refresh(); 
} 
 
void CWinList::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) 
{ 
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; 
// TODO: Add your control notification handler code here 
 
HWND hWnd=(HWND)pNMTreeView->itemNew.lParam; 
m_hSelected=hWnd; 
if (hPrevWnd) DrawFlash(hPrevWnd); 
hPrevWnd=hWnd; 
DrawFlash(hWnd); 
 
*pResult = 0; 
} 
 
BOOL CWinList::DestroyWindow() 
{ 
// TODO: Add your specialized code here and/or call the base class 
if (hPrevWnd) DrawFlash(hPrevWnd); 
return CDialog::DestroyWindow(); 
} 
 
 
/////////////////////////////////////////////////////////////////////////////
 
// DLL Export Interface 
 
extern "C" 
HWND FAR PASCAL EXPORT SearchWindow() 
{ 
CWinList WinList; 
if (WinList.DoModal()==IDOK) 
return WinList.m_hSelected; 
else 
return (HWND)NULL; 
}

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:[email protected] 电话:010-51297073

软件测试 | 领测国际 | ISTQB | ISTQB官网 | TMMi | TMMi认证 | 国际软件测试工程师认证 | 领测软件测试网