Win32进程创建顺序

时间:2017-06-23 17:16:47

标签: winapi

我想枚举应用程序的所有实例,并确定首先创建的实例(最旧的)。给定属于流程实例的HWND列表,我可以对列表进行排序以确定创建顺序吗?如果没有,还有另一种方式吗?

编辑1:被枚举的窗口不是由我的进程创建的,它们是在我的进程开始执行之前很久就创建的。

编辑2:正如评论中所提到的,我对处理过的创建时间感兴趣。我需要应用程序最旧实例的主窗口的HWND。不确定如何从进程ID获取HWND。

1 个答案:

答案 0 :(得分:3)

有两种不同的方法可以解决这个问题:

  1. 从Windows开始

    • 使用EnumWindows()FindWindow/Ex()循环查找您感兴趣的候选应用窗口。对于EnumWindows(),您可以使用{{1}之类的内容回调中有1}}和GetClassName()

    • 使用GetWindowText()获取每个窗口的PID。

    • 使用GetWindowThreadProcessId()打开每个PID,使用OpenProcess()获取其创建时间。

    • 现在您可以对时间进行排序以获得最旧的时间,并且您将知道与相应过程一起使用的窗口。

  2. 从流程开始

    • 使用GetProcessTimes()EnumProcesses()循环查找您感兴趣的应用路径+文件名的每个实例的PID。

    • 使用Process32(First|Next)()OpenProcess()获取创建时间,然后对其进行排序。

    • 然后,使用最早的PID,您可以枚举窗口以查找属于该PID的窗口。你可以:

      1. 如上所述枚举所有窗口,使用GetProcessTimes()查找PID。

      2. 在流程的每个主题上使用GetWindowThreadProcessId()。要获取进程的线程ID,您可以使用EnumThreadWindows()循环。

        可选地,假设进程的主线程是创建所需窗口的线程,则可以将窗口枚举限制为该线程。枚举价格线程,使用Thread32(First|Next)()OpenThread()查找最旧的线程ID,这将是主线程。