【发布时间】:2015-08-22 18:55:57
【问题描述】:
我正在尝试基于窗口句柄在 C# 中捕获桌面窗口。我正在使用 .NET 并使用 PInvoke 到 GetWindowRect() 来捕获窗口矩形。我的窗口选择和矩形捕获工作正常。
但是,捕获的窗口矩形不仅包括实际的窗口大小,还包括窗口周围的阴影等装饰物。当我尝试将窗口剪辑到位图时,位图包含区域和阴影。在 Windows 10 上,我得到透明阴影区域,包括活动窗口下方可能可见的任何内容:
我使用的代码很简单,使用 Win32 GetWindowRect() 通过 PInvoke 调用捕获窗口:
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() ,但这让我得到的只是客户区,这不是我所追求的。我想得到的是带有边框但没有阴影的实际 Window 矩形。
有没有办法做到这一点?
【问题讨论】:
-
您可能需要查看SystemInformation 以获得一致的边框大小,将其添加到客户区。
-
您应该从窗口的 DC (
GetWindowDC) 复制而不是从屏幕复制 - 即使它被另一个窗口覆盖,这也会得到窗口。另外,请参阅第三条评论on this page。 -
查看这个question 临时修改窗口创建参数以通过反转
CS_DROPSHADOW标志来移除阴影、捕获窗口并恢复蒙版。 -
@LucasTrzesniewski 我尝试使用 DC。还有其他问题 - 即我在一些所有者绘制的应用程序(如 Chrome)上获得了时髦的捕获行为。它仍然有边界。
-
尝试
DwmGetWindowAttributeDwmGetWindowAttribute function 与DWMWA_EXTENDED_FRAME_BOUNDS属性。