在 CTreeCtrl 中枚举系统中的所有窗口!(II) (转)

本文介绍了一种使用CTreeCtrl枚举系统中所有窗口的方法,并提供了详细的代码实现。通过该方法,可以构建出系统窗口的层级结构,并能够突出显示选中的窗口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 CTreeCtrl 中枚举系统中的所有窗口!(II) (转)[@more@]发信人: cvisual (贝贝), 信区: VisualC 
标 题: 在 CTreeCtrl 中枚举 系统中的所有窗口!(II) 
发信站: BBS 水木清华站 (Tue May 19 14:37:24 1998) 
 
这是实现 文件 
 
// WinList.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "mfc.h" 
#include "WinList.h" 
#include "mfc api.h" 
 
#ifdef _DE bug 
#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::DoData Exchange(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 CD wordArray 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; 
 EnumChild windows(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_INS ideFRAME,5*GetSystemMetrics(SM_CXBORDER),RGB(255,0,0)); 
 :: select object(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 { 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; 

 
 
-- 
┌————┐ 
│ 贝 贝 │ 
└————┘ 
 
 
※ 来源:·BBS 水木清华站 bbs .NET.tsinghua.edu.cn·[FROM: bbs.nju.edu.cn] 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-988415/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-988415/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值