通过进程找窗口 - 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);
}
COM调用
long FindWindowByProcessId(long process_id, string class, string title)
参数定义:
process_id
(长整型数): 要查找的进程ID,必须是有效的进程ID。class
(字符串): 窗口类名,支持模糊匹配。如果为空字符串(""),则匹配所有类名。title
(字符串): 窗口标题,支持模糊匹配。如果为空字符串(""),则匹配所有标题。
示例:
# 查找指定进程ID的主窗口
def find_main_window(pid):
hwnd = ola.FindWindowByProcessId(pid, "", "")
if hwnd != 0:
print(f"Found window for process ID {pid}: {hwnd}")
# 验证窗口状态
if ola.GetWindowState(hwnd, 2) == 1: # 检查是否可见
print("Window is visible")
# 激活并置顶窗口
ola.SetWindowState(hwnd, 1) # 激活
ola.SetWindowState(hwnd, 8) # 置顶
return hwnd
else:
print(f"No window found for process ID {pid}")
return 0
# 查找并操作进程的所有窗口
def manage_process_windows(pid):
windows = []
hwnd = ola.FindWindowByProcessId(pid, "", "")
while hwnd != 0:
windows.append(hwnd)
print(f"Found window: {hwnd}")
# 获取窗口状态信息
states = {
"Visible": ola.GetWindowState(hwnd, 2),
"Active": ola.GetWindowState(hwnd, 1),
"Maximized": ola.GetWindowState(hwnd, 4),
"Minimized": ola.GetWindowState(hwnd, 3)
}
print("Window states:")
for state, value in states.items():
print(f" {state}: {'Yes' if value == 1 else 'No'}")
# 继续查找下一个窗口
hwnd = ola.FindWindowByProcessId(pid, "", "")
return windows
# 示例:查找并管理Chrome进程的窗口
import psutil
def find_chrome_windows():
for proc in psutil.process_iter(['pid', 'name']):
if proc.info['name'].lower() == 'chrome.exe':
print(f"\nFound Chrome process: {proc.info['pid']}")
windows = manage_process_windows(proc.info['pid'])
print(f"Total Chrome windows found: {len(windows)}")
# 执行查找
find_chrome_windows()
返回值
长整型数:
- 非零值: 返回找到的窗口句柄
0
: 未找到匹配的窗口
注意事项
- 进程ID必须是当前运行的有效进程ID
- 类名和标题支持模糊匹配,可以只包含部分文本
- 空字符串参数会匹配任意值,可用于通配搜索
- 如果有多个匹配的窗口,函数返回第一个找到的窗口
- 建议先验证进程ID是否有效再进行查找
- 某些系统进程的窗口可能因权限问题无法被找到
- 进程必须具有可见的窗口才能被找到
- 可以结合 GetWindowState 和 SetWindowState 进行窗口操作