我想枚举应用程序的所有实例,并确定首先创建的实例(最旧的)。给定属于流程实例的HWND列表,我可以对列表进行排序以确定创建顺序吗?如果没有,还有另一种方式吗?
编辑1:被枚举的窗口不是由我的进程创建的,它们是在我的进程开始执行之前很久就创建的。
编辑2:正如评论中所提到的,我对处理过的创建时间感兴趣。我需要应用程序最旧实例的主窗口的HWND。不确定如何从进程ID获取HWND。
答案 0 :(得分:3)
有两种不同的方法可以解决这个问题:
从Windows开始
使用EnumWindows()
或FindWindow/Ex()
循环查找您感兴趣的候选应用窗口。对于EnumWindows()
,您可以使用{{1}之类的内容回调中有1}}和GetClassName()
。
使用GetWindowText()
获取每个窗口的PID。
使用GetWindowThreadProcessId()
打开每个PID,使用OpenProcess()
获取其创建时间。
现在您可以对时间进行排序以获得最旧的时间,并且您将知道与相应过程一起使用的窗口。
从流程开始
使用GetProcessTimes()
或EnumProcesses()
循环查找您感兴趣的应用路径+文件名的每个实例的PID。
使用Process32(First|Next)()
和OpenProcess()
获取创建时间,然后对其进行排序。
然后,使用最早的PID,您可以枚举窗口以查找属于该PID的窗口。你可以:
如上所述枚举所有窗口,使用GetProcessTimes()
查找PID。
在流程的每个主题上使用GetWindowThreadProcessId()
。要获取进程的线程ID,您可以使用EnumThreadWindows()
循环。
可选地,假设进程的主线程是创建所需窗口的线程,则可以将窗口枚举限制为该线程。枚举价格线程,使用Thread32(First|Next)()
和OpenThread()
查找最旧的线程ID,这将是主线程。