检索窗口大小没有Windows阴影

我想基于窗口句柄在C#中捕获桌面窗口。 我使用.NET,并使用PInvoke GetWindowRect()来捕获窗口矩形。 我有窗口select和矩形捕获工作正常。

但是,捕获的窗口矩形不仅包括实际的窗口大小,还包括窗口的装饰物,比如它周围的阴影。 当我尝试将窗口剪辑为位图时,位图包含区域和阴影。 在Windows 10上,我得到了透明阴影区域,包括可能在活动窗口下可见的任何内容:

在这里输入图像说明

我使用的代码非常简单,通过PInvoke调用捕获窗口使用Win32 GetWindowRect():

var rect = new Rect(); GetWindowRect(handle, ref rect); var bounds = new Rectangle(rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top); var result = new Bitmap(bounds.Width, bounds.Height); using (var graphics = Graphics.FromImage(result)) { graphics.CopyFromScreen(new Point(bounds.Left, bounds.Top), Point.Empty, bounds.Size); } return result; 

然后我捕捉图像并将其分配到图片框中。

另外,它看起来像是有一些窗口之间的变化 – 一些窗口有其他人没有的阴影。 大部分都是这样,但是有些像Visual Studio和Chrome一样,所以它甚至不是一个简单的剥离无关像素的问题。

我已经尝试过使用GetClientRect(),但这只是客户区,这不是我所追求的。 我想得到的是具有边界但没有阴影的实际窗口矩形。

有没有办法做到这一点?

我正在运行Windows 10,并在编写应用程序将窗口对齐到屏幕的顶部或底部时遇到相同的问题。 我发现DwmGetWindowAttribute()工作。 它返回一个与GetWindowRect()略有不同的值的RECT …

样本窗口的结果:

GetWindowRect():{X = 88,Y = 26,Width = 871,Height = 363}

DwmGetWindowAttribute():{X = 95,Y = 26,Width = 857,Height = 356}

我的测试显示GetWindowRect()包含了装饰,而DwmGetWindowAttribute()没有。

如果您在装饰窗口中使用这两种方法得到的结果相同,则可能是该特定窗口正在绘制自己的装饰,或者需要将其他一些属性或属性设置为需要考虑的窗口。