如何确定控件上方是否有窗口?

时间:2009-10-16 19:24:33

标签: c# .net windows winapi

如果我有一个Winforms控件,是否可以判断它上面是否有窗口(来自任何应用程序)?基本上,我需要知道我的控件的哪些部分实际上在屏幕上可见。

3 个答案:

答案 0 :(得分:3)

如果您对P / Invoke感到高兴,EnumWindows函数会枚举屏幕上的所有顶级窗口,给出一个HWND;从中你可以得到非客户端矩形(GetWindowRect)来与你的表单边界进行比较。

这不会考虑具有非矩形不透明区域的窗口(媒体播放器的花哨皮肤等),因此您可能会因为这样的窗口遮挡您的控件而误报。

答案 1 :(得分:0)

在Win32 API中,您可以使用WindowFromPoint来确定任何给定点的最顶层窗口。这不会告诉你你的整个控件是否可见,但是如果你测试所有4个角落它会给你很好的赔率。

答案 2 :(得分:0)

为什么要这些信息?通常当人们提出这个问题时,这是因为他们希望确保他们的UI处于前台,如果不是这样的话。而这通常是在他们试图将焦点从 具有前景的应用程序中移开之前发生的事情。

前景偷窃非常非常非常糟糕。当应用程序窃取焦点时,人们会非常不安。

话虽如此,上述两种技术中的任何一种都可行 - 我想我更喜欢Steve Gilham的答案中的EnumWindows / GetWindowRect / IntersectRect技术。

相关问题