如何使用API获取窗口句柄
窗口句柄
窗口句柄(HWND)是Windows操作系统中用于标识窗口的唯一值,通过句柄可以操作窗口(如发送消息、修改属性等),获取窗口句柄是许多自动化操作(如模拟点击、读取窗口信息)的前提。

获取窗口句柄的常用方法
使用 FindWindow 函数
根据窗口类名或窗口标题查找窗口句柄。
| 参数 | 类型 | 说明 |
|---|---|---|
| lpClassName | LPCWSTR | 窗口类名(如 “Button”)或 NULL |
| lpWindowName | LPCWSTR | (如 “记事本”)或 NULL |
示例代码(C++):
#include <windows.h>
#include <iostream>
int main() {
HWND hwnd = FindWindow(NULL, L"无标题 记事本"); // 按窗口标题查找
if (hwnd) {
std::wcout << L"找到窗口句柄: " << hwnd << std::endl;
} else {
std::wcout << L"未找到目标窗口" << std::endl;
}
return 0;
} 使用 EnumWindows 函数
枚举系统中所有顶级窗口,通过回调函数筛选目标窗口。
示例代码(C++):

#include <windows.h>
#include <iostream>
BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam) {
// 筛选窗口标题包含 "计算器" 的窗口
if (IsWindowVisible(hwnd) &&
std::wstring(GetWindowText(hwnd)).find(L"计算器") != std::wstring::npos) {
*reinterpret_cast<HWND*>(lParam) = hwnd; // 保存句柄
return FALSE; // 终止枚举
}
return TRUE; // 继续枚举
}
int main() {
HWND targetHwnd = NULL;
EnumWindows(EnumProc, reinterpret_cast<LPARAM>(&targetHwnd));
if (targetHwnd) {
std::wcout << L"找到计算器窗口句柄: " << targetHwnd << std::endl;
} else {
std::wcout << L"未找到计算器窗口" << std::endl;
}
return 0;
} 使用 GetForegroundWindow 函数
获取当前活动(前台)窗口的句柄。
示例代码(C++):
#include <windows.h>
#include <iostream>
int main() {
HWND hwnd = GetForegroundWindow(); // 获取当前活动窗口
if (hwnd) {
std::wcout << L"当前活动窗口句柄: " << hwnd << std::endl;
} else {
std::wcout << L"未找到活动窗口" << std::endl;
}
return 0;
} 注意事项
- 权限问题:部分系统窗口(如UAC提示框)可能无法通过普通权限获取句柄。
- 窗口可见性:
IsWindowVisible可判断窗口是否处于可见状态。 - 句柄有效性:窗口关闭后句柄失效,需重新获取。
- Unicode支持:宽字符版本函数(如
FindWindowW)支持中文标题。
相关问题与解答
问题1:如何验证获取的窗口句柄是否有效?
解答:
可通过以下方式验证:
- 调用
IsWindow(hwnd) 判断句柄是否指向有效窗口。 - 调用
GetWindowThreadProcessId(hwnd, NULL) 检查窗口是否属于当前进程(可选)。 - 尝试向窗口发送消息(如
SendMessage)并检查返回值。
示例代码:

if (IsWindow(hwnd)) {
std::wcout << L"句柄有效" << std::endl;
} else {
std::wcout << L"句柄无效" << std::endl;
} 问题2:如何获取指定窗口的子窗口句柄?
解答:
使用 FindWindowEx 函数,通过父窗口句柄和子窗口类名/标题查找。
示例代码:
HWND parentHwnd = FindWindow(NULL, L"父窗口标题"); HWND childHwnd = FindWindowEx(parentHwnd, NULL, L"Button", NULL); // 查找父窗口下的按钮控件
以上内容就是解答有关“api 获得窗口句柄”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复