我希望确定某个窗口对用户是否可见或隐藏/被遮挡。在Windows XP中,我将使用GetClipBox()函数并检查NULLREGION或空RECT返回值。这非常有效,但在Windows Vista上,如果另一个窗口遮挡了该窗口,则不起作用。在这种情况下,GetClipBox()会返回具有非空RECT的SIMPLEREGION。
请问有人知道为什么在Vista上不起作用,或者是否有其他方法来检查窗口是否可见于用户?
我希望确定某个窗口对用户是否可见或隐藏/被遮挡。在Windows XP中,我将使用GetClipBox()函数并检查NULLREGION或空RECT返回值。这非常有效,但在Windows Vista上,如果另一个窗口遮挡了该窗口,则不起作用。在这种情况下,GetClipBox()会返回具有非空RECT的SIMPLEREGION。
请问有人知道为什么在Vista上不起作用,或者是否有其他方法来检查窗口是否可见于用户?
您的Vista安装中,桌面窗口管理器合成是否打开?我猜测它是打开的,如果您关闭它,您将得到预期的XP行为。问题在于,在启用DWM合成的Vista下,窗口处理方式已经发生了很大变化,我认为没有简单的方法可以得到您想要的结果。
DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);
既然您已经知道了在XP和Vista上(启用或禁用DWM)GetClipRect的输出,那么您可以创建一个函数来确定这个值,它会根据不同的操作系统选择不同的执行路径。伪代码如下:
function bool IsWindowVisible()
{
bool isVisible = false;
if (OSVersion == "XP")
{
// GetClipRect tests which run on XP and set isVisible
}
else if (OSVersion == "Vista")
{
if (DWMCompisitionEnabled == true)
{
// GetClipRect tests for Vista with DWM enabled and set isVisible
}
else
{
// GetClipRect tests for Vista with DWM disabled and set isVisible
}
}
return isVisible;
}