两个用例:
枚举窗口,然后获取每个窗口的进程句柄
枚举进程,然后获取每个进程的主应用程序窗口句柄
答案 0 :(得分:6)
枚举窗口,然后获取每个窗口的进程句柄
您需要这些API:
win32gui.EnumWindows()
枚举所有顶级窗口(也就是没有子窗口控件)win32process.GetWindowThreadProcessId()
从窗口句柄获取进程ID win32api.OpenProcess()
从流程ID 枚举进程,然后获取主应用程序窗口句柄 对于每个过程
您需要这些API:
win32process.EnumProcesses()
枚举所有流程win32api.GetWindowLong()
与争辩GWL_STYLE
获取window styles和GWL_EXSTYLE
获取extended window styles win32gui.GetParent()
确定无主窗口通过使用EnumWindows()
过滤GetWindowThreadProcessId()
的结果,您可以获得属于给定流程的所有窗口。
确定主窗口可能很棘手,因为没有单一窗口样式可以将窗口指定为主窗口。毕竟,应用程序可能包含多个 主窗口。
您可以做的最好的事情是使用与taskbar uses to determine application windows相同的规则,因为用户认为主窗口:
只要有应用程序,Shell就会在任务栏上放置一个按钮 创建一个无主窗口 - 即一个没有窗口的窗口 parent,具有相应的扩展样式位。
确保窗口按钮是 放在任务栏上,用。创建一个无主窗口 WS_EX_APPWINDOW扩展样式。防止窗口按钮 被放置在任务栏上,用。创建无主窗口 WS_EX_TOOLWINDOW扩展样式。作为替代方案,您可以创建一个 隐藏窗口并使此隐藏窗口成为您可见的所有者 窗口。
使用GetParent()
和GetWindowLong()
根据这些规则确定具有正确窗口样式的无主窗口。