BOOL EnumWindows(
WNDENUMPROC lpEnumFunc, // callback function
LPARAM lParam // application-defined value
);
执行EnumWindows时,User32.dll会把传递进来的lpEnumFunc和lParam记录下来,然后开始遍历所有顶层
窗口。每找到一个窗口,user32.dll就把这个窗口的句柄跟lParam传递给回调函数lpEnumFunc并执行它。
lpEnumFunc是自定义的一个函数,它明显体现了应用程序跟操作系统交互的现象。如果lpEnumFunc返回
true则user32.dll会继续遍历窗口,如果lpEnumFunc返回false则user32.dll停止遍历窗口,EnumWindows
的任务也就完成了(否则直到所有窗口被遍历完)。
lpEnumFunc的声明形式是这样的:
BOOL __stdcall EnumProc( HWND hWnd, LPARAM parameter );
其中 LPARAM parameter 是通过EnumWindows 的LPARAM lParam 传进来的。
// 以下代码抄了网上的
BOOL __stdcall EveryWindowProc(HWND hWnd, LPARAM parameter )
{
// 不可见、不可激活的窗口不作考虑。
if ( !IsWindowVisible(hWnd) )
return TRUE;
if ( !IsWindowEnabled(hWnd) )
return TRUE;
// 弹出式窗口,但没有标题的不作考虑。
LONG gwl_style = GetWindowLong( hWnd, GWL_STYLE );
if ((gwl_style & WS_POPUP) && !(gwl_style & WS_CAPTION))
return TRUE;
// 父窗口是可见或可激活的窗口不作考虑。
HWND hParent = (HWND)GetWindowLong( hWnd, GWL_HWNDPARENT );
if ( IsWindowEnabled(hParent) )
return TRUE;
if ( IsWindowVisible(hParent) )
return TRUE;
// Shell_TrayWnd类的窗口(托盘里面的)不作考虑。
TCHAR szClassName[MAX_PATH];
GetClassName( hWnd, szClassName, MAX_PATH );
if ( !wcscmp(szClassName, _T("Shell_TrayWnd")) )
return TRUE;
if ( nFlag == 0 )
{
// 最小化
CloseWindow( hWnd );
}
else
{
// 激活并恢复原大小及位置
OpenIcon( hWnd );
}
return TRUE;
}
我: 在查找Windows窗口中, 好多人通过窗口的标题来判断是否要找的窗口, 这是一种方法。还有一种方
法, 就是通过类名来查找(如果是你自己实现的程序), 看看修改:名的方法是怎样的:
1、新建一个基于对话框工程,工程名为test。
2、修改资源文件。
用记事本或其它文本编辑工具打test.rc,找到这样的一段,加入自定义类名
IDD_TEST_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_MODALFRAME WS_POPUP WS_VISIBLE WS_CAPTION WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "test"
CLASS "BlackFox的对话框" // 在这加入类名
FONT 9, "宋体"
3、注册窗口类。
在BOOL CTestApp::InitInstance()中构造对话框之前加入以下代码:
WNDCLASS wndMyClass;
::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wndMyClass);//取得原来对话框的窗口类属性
wndMyClass.lpszClassName = "BlackFox的对话框";//将类名改成自定义的类名
AfxRegisterClass(&wndMyClass); file://关键的一行,如果不注册,对话框就出不来了。
5、编译程序,用Spy++看看。搞定了。
我刚学VC不久,希望各位大虾批评指正!
http://blog.csdn.net/bluesky_03/archive/2008/04/22/2314978.aspx