跳到主要内容

User32 系统模块

EnumWindows 枚举顶级窗口

EnumWindows 是 Windows API 提供的一个函数,用于枚举系统中所有顶级窗口。它是 Windows 用户界面 (User Interface, UI) 相关的函数,位于 User32.dll 模块中。

BOOL EnumWindows(
WNDENUMPROC lpEnumFunc,
LPARAM lParam
);
  • lpEnumFunc 是一个回调函数的指针,该回调函数将对每个顶级窗口调用。
  • lParam 是传递给回调函数的应用程序定义的值。

回调函数的定义如下:

BOOL CALLBACK EnumWindowsProc(
HWND hwnd,
LPARAM lParam
);
  • hwnd 是顶级窗口的句柄。
  • lParam 是传递给 EnumWindows 函数的应用程序定义的值。

使用方法

下面是一个使用 EnumWindows 枚举所有顶级窗口的示例(用 C 语言编写):

#include <windows.h>
#include <stdio.h>

// 回调函数,用于处理每个枚举到的窗口
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) {
char windowTitle[256];
GetWindowText(hwnd, windowTitle, sizeof(windowTitle));

if (IsWindowVisible(hwnd) && strlen(windowTitle) != 0) {
printf("Window title: %s\n", windowTitle);
}

return TRUE; // 返回 TRUE 继续枚举下一个窗口
}

int main() {
// 调用 EnumWindows 并传递回调函数
EnumWindows(EnumWindowsProc, 0);

return 0;
}

在这个例子中,EnumWindows 会枚举所有顶级窗口,并对每个窗口调用 EnumWindowsProc 回调函数。如果窗口是可见的并且标题不为空,回调函数会打印窗口的标题。

Python 示例

如果你想在 Python 中使用 EnumWindows,可以使用 ctypes 模块来调用这个 API:

import ctypes
from ctypes import wintypes

# 定义回调函数类型
EnumWindowsProc = ctypes.WINFUNCTYPE(
wintypes.BOOL,
wintypes.HWND,
wintypes.LPARAM
)

# 加载 User32.dll 模块
user32 = ctypes.WinDLL('user32', use_last_error=True)

# 定义 EnumWindows 函数
user32.EnumWindows.argtypes = [
EnumWindowsProc,
wintypes.LPARAM
]
user32.EnumWindows.restype = wintypes.BOOL

# 回调函数
def enum_windows_proc(hwnd, lParam):
window_title = ctypes.create_string_buffer(256)
user32.GetWindowTextA(hwnd, window_title, 256)

if user32.IsWindowVisible(hwnd) and len(window_title.value) > 0:
print(f"Window title: {window_title.value.decode('utf-8')}")

return True

# 调用 EnumWindows
if __name__ == "__main__":
enum_proc = EnumWindowsProc(enum_windows_proc)
user32.EnumWindows(enum_proc, 0)

在这个 Python 示例中,EnumWindows 会枚举所有顶级窗口,并对每个窗口调用 enum_windows_proc 回调函数。如果窗口是可见的并且标题不为空,回调函数会打印窗口的标题。