源代码:http://download.csdn.net/detail/nuptboyzhb/4162747
枚举窗体的信息
1. 新建一个基于单文档的应用程序,注意将View类的父类设置为CListView,并在PreCreateWindow函数中设置它的风格:
cs.style |= LVS_REPORT | LVS_NOSORTHEADER;//设置列表视为报表格式
2. 在OnInitialUpdate消息响应函数中,增加列的标题:
CListCtrl& lc = GetListCtrl();//获得列表视图的控制
lc.InsertColumn(0, _T("窗口句柄"),LVCFMT_LEFT,180);
lc.InsertColumn(1, _T("窗口类"),LVCFMT_LEFT,180,1);
lc.InsertColumn(2, _T("窗口标题"),LVCFMT_LEFT,200,1);
lc.InsertColumn(3, _T("窗口风格"),LVCFMT_LEFT,100,1);
lc.InsertColumn(4, _T("窗口位置大小(屏幕坐标)"),LVCFMT_LEFT,210,1);
3. 新增一个菜单项,点击菜单,即执行获取函数,编辑代码如下:
CListCtrl& lc = GetListCtrl();
lc.DeleteAllItems();
EnumWindows(MyEnumWindowsProc, (LPARAM)this);//遍历窗口程序
注意:第一个参数是回调函数,第二个参数是回调函数的参数;回调函数应事先声明,
4. 编写回调函数;
BOOL CALLBACK CEnumWindowsProcView::MyEnumWindowsProc(HWND hwnd,
LPARAM lParam)
{
CEnumWindowsProcView* pView = (CEnumWindowsProcView*)lParam;
CListCtrl& lc =pView->GetListCtrl();
int iItem=-1;
DWORD dwStyle = GetWindowLong(hwnd, GWL_STYLE);//获得窗体的风格
CString s;
s.Format("主窗口(%04X)",hwnd);
//窗口句柄
iItem = lc.InsertItem(lc.GetItemCount(),s);
CWnd* pWnd = CWnd::FromHandle(hwnd);
// 窗口类名
::GetClassName(hwnd, s.GetBuffer(256), 256);
int iSubitem = 1;
lc.SetItemText(iItem,iSubitem++,s);
// 窗口标题
pWnd->GetWindowText(s);
lc.SetItemText(iItem,iSubitem++,s);
CString str;
// 窗口风格
str.Format(_T("0x%x"),dwStyle);
lc.SetItemText(iItem,iSubitem++,str);
CRect rect;
::GetWindowRect(hwnd,&rect);
//窗口大小及位置
str.Format(_T("(x0=%d,y0=%d,x1=%d,y1=%d)"),rect.left,rect.top,rect.right,rect.bottom);
lc.SetItemText(iItem,iSubitem++,str);
flag++;
return TRUE;
}
向窗体发送关闭消息
主要思路,就是对枚举得到的窗口进行过滤,用SendMessage函数,发送WM_CLOSE消息;