在 Windows 编程中,FindWindow 是一个非常常用的 API 函数,用于查找与指定类名或窗口名匹配的窗口。它属于 Windows API,并且通常与 Windows GUI 编程(例如,使用 C++ 或其他语言)一起使用。

1. FindWindow 函数简介

FindWindow 函数可以在当前运行的窗口中搜索指定类名或窗口名称的窗口句柄。它返回的是第一个匹配的窗口句柄。如果没有找到匹配的窗口,则返回 NULL

函数原型

HWND FindWindow(
  LPCSTR lpClassName,  // 窗口类名
  LPCSTR lpWindowName  // 窗口标题
);

  • lpClassName: 要查找的窗口的类名。如果不关心类名,可以传递 NULL
  • lpWindowName: 要查找的窗口的标题。如果不关心窗口标题,可以传递 NULL

返回值:

  • 返回窗口的句柄(HWND),如果成功找到符合条件的窗口。
  • 如果没有找到符合条件的窗口,返回 NULL

2. 使用示例

以下是一个 C++ 示例,演示如何使用 FindWindow 来查找一个特定标题的窗口,并显示其句柄。

示例:查找一个特定标题的窗口

#include <windows.h>
#include <iostream>

int main() {
    // 设置要查找的窗口标题
    LPCSTR windowTitle = "Untitled - Notepad";  // 假设是 Notepad 的窗口标题

    // 查找窗口
    HWND hwnd = FindWindow(NULL, windowTitle);  // 类名为 NULL,表示不关心类名

    // 判断是否找到了窗口
    if (hwnd != NULL) {
        std::cout << "Window found! HWND: " << hwnd << std::endl;
    } else {
        std::cout << "Window not found!" << std::endl;
    }

    return 0;
}

在这个示例中,我们查找了窗口标题为 "Untitled - Notepad" 的窗口。如果找到了符合条件的窗口,就输出其句柄;否则输出 “Window not found!”。

示例:查找指定类名的窗口

#include <windows.h>
#include <iostream>

int main() {
    // 设置要查找的窗口类名
    LPCSTR className = "Notepad";  // 例如 Notepad 的窗口类名

    // 查找窗口
    HWND hwnd = FindWindow(className, NULL);  // 窗口标题为 NULL,表示不关心标题

    // 判断是否找到了窗口
    if (hwnd != NULL) {
        std::cout << "Window found! HWND: " << hwnd << std::endl;
    } else {
        std::cout << "Window not found!" << std::endl;
    }

    return 0;
}

在这个示例中,我们查找了类名为 "Notepad" 的窗口。如果找到了符合条件的窗口,就输出其句柄。

3. 常见应用场景

  • 自动化操作:可以用于自动化控制其他程序的窗口,如发送按键事件、控制窗口最大化/最小化等。
  • 窗口管理:在开发桌面应用程序时,可能需要与其他程序的窗口进行交互,FindWindow 是一种常用的方法。
  • 检查窗口是否存在:可以用于检查某个应用程序是否正在运行(通过窗口标题或类名)。

4. 注意事项

  • FindWindow 只会找到第一个匹配的窗口:如果存在多个窗口具有相同的标题或类名,FindWindow 只会返回第一个找到的窗口句柄。
  • FindWindow 不会递归子窗口:它仅在顶级窗口中搜索。如果你需要查找某个窗口的子窗口,可以使用 FindWindowEx
  • 窗口标题和类名的匹配是区分大小写的FindWindow 会精确匹配窗口的标题和类名,因此需要确保提供正确的名称。

5. FindWindowEx 函数

如果你想查找某个窗口的子窗口,可以使用 FindWindowEx。与 FindWindow 类似,FindWindowEx 允许你指定父窗口、子窗口以及其他过滤条件。以下是 FindWindowEx 的原型:

HWND FindWindowEx(
  HWND hwndParent,    // 父窗口的句柄
  HWND hwndChildAfter,// 子窗口句柄(通常设为 NULL)
  LPCSTR lpClassName, // 窗口类名
  LPCSTR lpWindowName // 窗口标题
);

6. 总结

  • FindWindow 是一个强大的 Windows API 函数,用于查找指定类名或窗口标题的窗口。
  • 它可以通过窗口标题和/或类名来搜索窗口,广泛用于自动化脚本、桌面应用程序以及窗口管理。
  • 如果需要递归查找子窗口或更复杂的查找功能,可以使用 FindWindowEx