MFC枚举所有窗体,并向打开的窗体发送关闭消息

源代码: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消息;

你可能感兴趣的:(MFC枚举所有窗体,并向打开的窗体发送关闭消息)