C# 获取在C中实际可见的进程/窗口#

C# 获取在C中实际可见的进程/窗口#,c#,process,window,visible,C#,Process,Window,Visible,我有一个所有打开窗口的列表,这些窗口位于windows任务栏中。我想做的是从列表中删除那些不可见的 我的意思是,如果一个窗口被另一个窗口隐藏,它不应该在我的列表中 在过去的两天里,我一直在搜索谷歌,但没有成功 有什么想法吗 PS:我可以得到每个进程的位置和大小,所以得到最后一次使用进程/空闲时间也会有用 您需要使用区域,窗口中仍然可见的可以是一组复杂的矩形。从要检查的窗口开始,GetWindowRect和CreateRectRegion为窗口矩形创建一个区域 在循环中调用GetWindow(),

我有一个所有打开窗口的列表,这些窗口位于windows任务栏中。我想做的是从列表中删除那些不可见的

我的意思是,如果一个窗口被另一个窗口隐藏,它不应该在我的列表中

在过去的两天里,我一直在搜索谷歌,但没有成功

有什么想法吗


PS:我可以得到每个进程的位置和大小,所以得到最后一次使用进程/空闲时间也会有用

您需要使用区域,窗口中仍然可见的可以是一组复杂的矩形。从要检查的窗口开始,GetWindowRect和CreateRectRegion为窗口矩形创建一个区域

在循环中调用GetWindow(),传递GW_hwndprov。它以Z顺序返回上一个窗口,以便重叠。GetWindowRect()获取其矩形,CreateRectRegion()并使用CombineRgn()和RGN_DIFF将其与原始窗口区域组合


当GetWindow返回NULL时,您已经找到了所有可能的重叠窗口。使用GetRgnBox检查该区域是否还有剩余内容。如果有,至少有一部分窗口没有重叠

Cr*p,是C。您需要使用pinvoke GetWindowRect和GetWindow,使用pinvoke.net。你可以用.NET Region类来做其他的事情。@David-OT:你怎么看其他人这么快就发帖了?希望有魔力,我错过了太多的帖子,而明星也没有让我的船浮起来。@Hans:新来的家伙Erik,他提到了一个他用过的名字,但我太过勒德主义了,弄不清楚它有什么作用或有什么帮助。现在那个家伙跑得很快,看起来飞碟也在用。谢谢@David。我真的不知道你所说的流程的位置和大小是什么意思。有大小和位置的是窗口,而不是进程。空闲时间也无济于事。被遮挡的窗口可以是繁忙的,也可以是空闲的,最上面的窗口也是如此。