EnumWindows 用来列举屏幕上所有顶层窗口。
MSDN原话:
The EnumWindows function enumerates all top-level windows on the screen by passing the handle to each window。函数形式:
BOOL EnumWindows( WNDENUMPROC lpEnumFunc, // callback function LPARAM lParam // application-defined value );
其中 WNDENUMPROC 是回调函数,回调函数中写自己想做的操作,当调用EnumWindows的
时候,每次遇到一个窗口,系统就调用一次你的WNDENUMPROC ,然后把窗口句柄传给你。
EnumWindows
函数成功则返回非0值;
函数失败则返回0值;
EnumWindowsProc 返回0值,同样导致函数EnumWindows 返回0值。
另外,该函数不列举子窗口,除了几种拥有WS_CHILD 风格的系统所属窗口。
MSDN原话:
The EnumWindows function does not enumerate child windows,with the exception
of a few top-level windows owned by the system that have the WS_CHILD style.
使用举例:
先声明一个EnumWindowsProc ,比如:
BOOL CALLBACK EnumWindowsProc_1(HWND hwnd,LPARAM lparam) ;
然后实现此函数,写入自己想做的事情,比如:
BOOL CALLBACK EnumWindowsProc_1(HWND hwnd,LPARAM lparam)
{
char lpWinTitle[256];
::GetWindowText(hwnd,lpWinTitle,256-1);
CString m_strTitle;
m_strTitle.Format("%s",lpWinTitle);
if(m_strTitle.Find("Internet Explorer")!=-1)
{
AfxMessageBox("这是一个IE窗口!") ;
}
return TRUE ;
}
然后就可以在其他地方调用EnumWindows的时候使用回调函数,比如:
::EnumWindows(EnumWindowsProc_1,0) ;
这样每当遇到IE窗口时,就会进行 提示“这是一个IE窗口!” 的操作
注意: 1.这个回调函必须是全局的,否则会出现error
2.使用时 ::EnumWindows((WNDENUMPROC)EnumWindowsProc_1,0) ;
3.最后一个参数为LPARAM,通常传递的是this即(LPARAM)this
4.如果要对拣选出的所有的窗口发消息,那么这些窗口应该都处于不最小化的激活状态。
一般是最先被拣选出的顶层窗口可以接收到消息,其他窗口需要被激活后(鼠标点击选中)才会接
收到消息。用BringWindowToTop(Hwnd)将窗口带入顶层。还有SetForegroundWindow(Hwnd)可用