枚举当前所有打开的窗口

效果:在列表框中显示当前所有打开窗口的标题。
通过Windows的API函数EnumWindows,该函数的第一个参数是一个回调函数。

(1)新建一个基于对话框的MFC应用程序EnumWindowsTest,删除对话框中原有控件。

(2)在对话框上放置一个按钮和一个列表框,然后添加按钮事件函数如下:

void CEnumWindowsTestDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	m_lst.ResetContent();
	EnumWindows(EnumWindowsProc,(LPARAM)this);
}

(3)其中m_lst是列表框的控件变量,EnumWindows是Windows的API函数,EnumWindowsProc为一个回调函数:

//枚举窗口回调函数
BOOL static CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
	CString str;

	int length = ::GetWindowTextLength(hWnd);
	CEnumWindowsTestDlg *pDlg = (CEnumWindowsTestDlg*)lParam;

	if(::GetWindowLong(hWnd,GWL_STYLE)&WS_VISIBLE) //可见窗口
	{    
		if( length>0 ) //窗口标题长度大于0
		{    
			if( gCount<1000) 
			{
				TCHAR* buf = new TCHAR[length+1]; //如果是多字节环境,则为2*length+1
				memset(buf,0,2*length+1);
				::GetWindowText(hWnd,buf,2*length);
	
				str.Format(_T("%s"),buf);

				pDlg->m_lst.AddString(str);
				delete buf;

				gCount++;
			}
		}
	}

	return 1;
}

(4)其中,gCount上一个全局变量,定义如下:
int gCount = 0;//统计窗口个数

(5)保存工程并运行,运行结果如图所示:
枚举当前所有打开的窗口_第1张图片

你可能感兴趣的:(Microsoft,Visual,Studio,2010)