EnumWindows AddressOf
时间: 2025-01-11 19:33:21 浏览: 28
### 使用 `EnumWindows` 函数和回调函数的示例
在 Windows API 编程中,`EnumWindows` 是一个用于枚举所有顶级窗口的函数。此函数会调用应用程序定义的回调函数来处理每个找到的窗口。为了实现这一点,通常需要传递一个指向回调函数的指针给 `EnumWindows`。
下面是一个完整的 C++ 示例程序,展示了如何使用 `EnumWindows` 和 `AddressOf` 来遍历并打印所有顶层窗口的类名和标题:
```cpp
#include <windows.h>
#include <tchar.h>
// 定义全局变量存储匹配到的第一个窗口句柄 (可选)
HWND g_hwndFound = NULL;
// 回调函数声明
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
int _tmain(int argc, TCHAR* argv[])
{
// 枚举所有顶级窗口
BOOL bResult = EnumWindows(EnumWindowsProc, 0);
if (!bResult && GetLastError() != ERROR_NO_MORE_FILES)
{
_tprintf(_T("Error during enumeration.\n"));
}
return 0;
}
// 实现回调函数
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
TCHAR szClassName[256];
TCHAR szWindowTitle[256];
// 获取窗口类名
GetClassName(hwnd, szClassName, sizeof(szClassName)/sizeof(TCHAR));
// 获取窗口标题
GetWindowText(hwnd, szWindowTitle, sizeof(szWindowTitle)/sizeof(TCHAR));
// 打印窗口信息
_tprintf(_T("Class Name: %s\n"), szClassName);
_tprintf(_T("Window Title: %s\n"), szWindowTitle);
_tprintf(_T("--\n"));
// 如果找到了特定条件下的窗口可以设置g_hwndFound=hwnd; 并返回FALSE终止枚举(可选)
return TRUE; // 返回TRUE继续枚举下一个窗口
}
```
在这个例子中,通过 `_tmain()` 调用了 `EnumWindows` 函数,并传入了自定义的回调函数 `EnumWindowsProc` 的地址作为参数。每当发现一个新的顶级窗口时,系统就会自动调用这个回调函数[^1]。
当编写此类代码时需要注意以下几点:
- 确保编译器支持 Unicode 或 ANSI 版本的选择(这里使用了宏定义 `_UNICODE`),以便正确处理字符串。
- 处理可能发生的错误情况,比如内存不足或其他异常状况。
- 可能还需要考虑线程安全性和多显示器环境中的行为等问题。
阅读全文
相关推荐



