Winapi Win32进程创建顺序

Winapi Win32进程创建顺序,winapi,Winapi,我想列举一个应用程序的所有实例,并确定哪个实例是首先创建的(最早的)。给定一个属于流程实例的HWD列表,我可以对该列表进行排序以确定创建顺序吗?如果没有,还有别的办法吗 编辑1:枚举的窗口不是由我的进程创建的,它们是在我的进程开始执行之前很久创建的 编辑2:正如评论中所提到的,我对处理后的文件的创建时间感兴趣。我需要最早的应用程序实例的主窗口的HWND。不确定如何从进程ID获取HWND。有两种不同的方法: 从窗口开始 使用EnumWindows()或FindWindow/Ex()循环查找您感兴

我想列举一个应用程序的所有实例,并确定哪个实例是首先创建的(最早的)。给定一个属于流程实例的HWD列表,我可以对该列表进行排序以确定创建顺序吗?如果没有,还有别的办法吗

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


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

有两种不同的方法:

  • 从窗口开始

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

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

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

    • 现在,您可以对时间进行排序,以获得最早的时间,并且您将知道与相应流程一起出现的窗口

  • 从流程开始

    • 使用
      enumprocess()
      Process32(First | Next)(
      循环查找您感兴趣的应用程序路径+文件名的每个实例的PID

    • 使用
      OpenProcess()
      GetProcessTimes()
      获取它们的创建时间,然后对它们进行排序

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

    • 如上所述枚举所有窗口,使用
      GetWindowThreadProcessId()
      查找PID

    • 在进程的每个线程上使用
      EnumThreadWindows()。要获取进程的线程ID,可以使用
      Thread32(First | Next)(
      循环

      或者,假设进程的主线程是创建所需窗口的线程,则可以将窗口枚举仅限于该线程。枚举pricess的线程,使用
      OpenThread()
      GetThreadTimes()
      查找最早的线程ID,该ID将是主线程


  • 有两种不同的方法可以实现这一点:

  • 从窗口开始

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

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

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

    • 现在,您可以对时间进行排序,以获得最早的时间,并且您将知道与相应流程一起出现的窗口

  • 从流程开始

    • 使用
      enumprocess()
      Process32(First | Next)(
      循环查找您感兴趣的应用程序路径+文件名的每个实例的PID

    • 使用
      OpenProcess()
      GetProcessTimes()
      获取它们的创建时间,然后对它们进行排序

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

    • 如上所述枚举所有窗口,使用
      GetWindowThreadProcessId()
      查找PID

    • 在进程的每个线程上使用
      EnumThreadWindows()。要获取进程的线程ID,可以使用
      Thread32(First | Next)(
      循环

      或者,假设进程的主线程是创建所需窗口的线程,则可以将窗口枚举仅限于该线程。枚举pricess的线程,使用
      OpenThread()
      GetThreadTimes()
      查找最早的线程ID,该ID将是主线程


  • @Alex,谢谢--这看起来很有希望。
    GetProcessTimes
    不会返回窗口创建时间。要么问题是关于作者无意问的问题,要么建议不匹配。@i不可检测如果问题窗口是应用程序的主窗口,则其创建时间将接近进程的创建时间。但在任何情况下,OP显然是在寻找进程创建时间,但使用窗口枚举来查找进程。我会用进程枚举代替。请编辑您的问题,让它询问您真正想要的,特别是问题标题。完成后,如果@RemyLebeau是正确的,这个问题可能会被重新打开,因为重复的问题不适用。@Alex,谢谢——这看起来很有希望。
    GetProcessTimes
    不会返回窗口创建时间。要么问题是关于作者无意问的问题,要么建议不匹配。@i不可检测如果问题窗口是应用程序的主窗口,则其创建时间将接近进程的创建时间。但在任何情况下,OP显然是在寻找进程创建时间,但使用窗口枚举来查找进程。我会用进程枚举代替。请编辑您的问题,让它询问您真正想要的,特别是问题标题。完成后,如果@RemyLebeau是正确的,这个问题可能应该重新打开,因为重复的内容不适用。