C# 如何获取未响应前台应用的进程Id?

C# 如何获取未响应前台应用的进程Id?,c#,windows,winapi,pinvoke,C#,Windows,Winapi,Pinvoke,我有一个进程来监视用户当前正在工作的窗口。要通过HWND获取进程ID,我使用。但是,如果前台应用程序挂起,我将获得的进程Id。我可以确定应用程序是否挂起。但是如何获得应用程序的真实进程Id?使用C、System.Diagnostics和System.Linq,您可以这样做: List<IntPtr> handles = System.Diagnostics.Process.GetProcesses()

我有一个进程来监视用户当前正在工作的窗口。要通过HWND获取进程ID,我使用。但是,如果前台应用程序挂起,我将获得的进程Id。我可以确定应用程序是否挂起。但是如何获得应用程序的真实进程Id?

使用C、System.Diagnostics和System.Linq,您可以这样做:

List<IntPtr> handles = System.Diagnostics.Process.GetProcesses()
                                                 .Where(x => !x.Responding)
                                                 .Select(x => x.MainWindowHandle).ToList();
返回未响应进程的句柄。

使用C、System.Diagnostics和System.Linq,您可以执行以下操作:

List<IntPtr> handles = System.Diagnostics.Process.GetProcesses()
                                                 .Where(x => !x.Responding)
                                                 .Select(x => x.MainWindowHandle).ToList();

它返回没有响应的进程的句柄。

我们可以使用user32.dll HungWindowFromGhostWindow中未记录的方法从ghost句柄获取真实的窗口句柄。如果windows被挂起,dwm将创建其ghost副本。


我们可以使用user32.dll HungWindowFromGhostWindow中未记录的方法从ghost handle中获取真实的窗口句柄。如果windows处于挂起状态,dwm将创建其ghost副本。



使用System.Diagnostics.Process类对您来说是一个选项吗?@user3185569,System.Diagnostics.Process在我的情况下有什么好处?您试图过滤掉dwm.exe?@ArtavazdBalayan您可以使用它查询没有响应的进程并获取其进程ID。@user3185569,不清楚。你能举一些例子吗?使用System.Diagnostics.Process类对你来说是一个选项吗?@user3185569,System.Diagnostics.Process在我的情况下有什么好处?你试图过滤掉dwm.exe?@ArtavazdBalayan你可以用它来查询没有响应的进程并获取它们的进程ID。@user3185569,不清楚。你能举一些例子吗?它会给出没有响应的应用程序的进程ID。但是如何将它映射到前台窗口?我应该使用Process.MainWindowHandle吗?@ArtavazdBalayan该进程必须有一个接口,以便MainWindowHandle工作。起初我接受了你的回答,因为它确实得到了挂起的应用程序。但如果前台应用程序挂起,GetForeGroundIndow将返回DWM创建的重影窗口HWND,而不是真实窗口HWND。您知道如何在不使用我的示例中未记录的函数的情况下将ghost-HWND转换为real-HWND的其他想法吗?它将给出没有响应的应用程序的进程ID。但是如何将它映射到前台窗口?我应该使用Process.MainWindowHandle吗?@ArtavazdBalayan该进程必须有一个接口,以便MainWindowHandle工作。起初我接受了你的回答,因为它确实得到了挂起的应用程序。但如果前台应用程序挂起,GetForeGroundIndow将返回DWM创建的重影窗口HWND,而不是真实窗口HWND。您知道如何将ghost-HWND转换为real-HWND而不使用我的示例中未记录的函数吗?为什么我们要使用这个未记录的api?你肯定明白这些风险吗?你知道你不该这么做吗?谁说挂着的窗户有鬼窗户。通常情况下,他们不会。进程可以禁用重影。另外,由于还没有人尝试与窗口交互,窗口可以挂起而不会被重影。@David Heffernan,至少是TaskManager[taskmgr.exe]。我给出了测试代码。在检查之前,可以使用WM_NULL发送。当然,如果有人打电话的话,这是行不通的。你有更好的主意吗?任务管理器是is外壳的一部分。当然,它可以使用私有api调用。但是你不能。这个问题的问题是我们不知道你为什么问。也许您真正的问题有不同的解决方案。为什么我们要使用这个未记录的api?你肯定明白这些风险吗?你知道你不该这么做吗?谁说挂着的窗户有鬼窗户。通常情况下,他们不会。进程可以禁用重影。另外,由于还没有人尝试与窗口交互,窗口可以挂起而不会被重影。@David Heffernan,至少是TaskManager[taskmgr.exe]。我给出了测试代码。在检查之前,可以使用WM_NULL发送。当然,如果有人打电话的话,这是行不通的。你有更好的主意吗?任务管理器是is外壳的一部分。当然,它可以使用私有api调用。但是你不能。这个问题的问题是我们不知道你为什么问。也许你真正的问题有不同的解决方案。