通过进程找窗口 - FindWindowByProcessId
函数简介
根据进程ID、窗口类名和标题查找可见窗口。此函数提供了一种精确的方式来定位特定进程ID的窗口。
接口名称
FindWindowByProcessId
DLL调用
long FindWindowByProcessId(long ola, long process_id, string class, string title)
参数定义:
ola
(长整型数): OLAPlug对象的指针,由 CreateCOLAPlugInterFace 接口生成。process_id
(长整型数): 要查找的进程ID,必须是有效的进程ID。class
(字符串): 窗口类名,支持模糊匹配。如果为空字符串(""),则匹配所有类名。title
(字符串): 窗口标题,支持模糊匹配。如果为空字符串(""),则匹配所有标题。
示例:
// 查找指定进程ID的主窗口
long hwnd = FindWindowByProcessId(ola, 1234, "", "");
if (hwnd != 0) {
printf("Found window for process ID 1234: %ld\n", hwnd);
// 验证窗口状态
if (GetWindowState(ola, hwnd, 2) == 1) { // 检查是否可见
printf("Window is visible\n");
// 获取窗口信息
char title[256];
char className[256];
GetWindowText(hwnd, title, sizeof(title));
GetClassName(hwnd, className, sizeof(className));
printf("Window Title: %s\n", title);
printf("Window Class: %s\n", className);
}
} else {
printf("No window found for process ID 1234\n");
}
// 查找指定进程ID的特定类名窗口
hwnd = FindWindowByProcessId(ola, 5678, "Chrome_WidgetWin_1", "");
if (hwnd != 0) {
printf("Found Chrome window for process ID 5678: %ld\n", hwnd);
// 检查窗口状态
int isActive = GetWindowState(ola, hwnd, 1);
int isMaximized = GetWindowState(ola, hwnd, 4);
printf("Window is %sactive and %smaximized\n",
isActive ? "" : "not ",
isMaximized ? "" : "not ");
} else {
printf("No Chrome window found for process ID 5678\n");
}
// 查找进程的所有窗口
void FindAllWindowsForProcess(long pid) {
long hwndArray[10]; // 假设最多存储10个窗口句柄
int count = 0;
long hwnd = FindWindowByProcessId(ola, pid, "", "");
while (hwnd != 0 && count < 10) {
hwndArray[count++] = hwnd;
printf("Found window %d for process %ld: %ld\n", count, pid, hwnd);
// 继续查找下一个窗口
hwnd = FindWindowByProcessId(ola, pid, "", "");
}
printf("Total windows found for process %ld: %d\n", pid, count);
}
返回值
长整型数:
- 非零值: 返回找到的窗口句柄
0
: 未找到匹配的窗口
注意事项
- 进程ID必须是当前运行的有效进程ID
- 类名和标题支持模糊匹配,可以只包含部分文本
- 空字符串参数会匹配任意值,可用于通配搜索
- 如果有多个匹配的窗口,函数返回第一个找到的窗口
- 建议先验证进程ID是否有效再进行查找
- 某些系统进程的窗口可能因权限问题无法被找到
- 进程必须具有可见的窗口才能被找到
- 可以结合 GetWindowState 和 SetWindowState 进行窗口操作