我有一个捕获WPF控件截图的功能:
public System.Drawing.Bitmap CaptureScreenshot()
{
Point p = this.PointToScreen(new Point(0, 0));
System.Drawing.Rectangle rc = new System.Drawing.Rectangle((int)p.X, (int)p.Y, (int)this.ActualWidth, (int)this.ActualHeight);
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(rc.Width, rc.Height);
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap))
{
g.CopyFromScreen(rc.Location, System.Drawing.Point.Empty, rc.Size);
}
return bitmap;
}
这在Win7中运行良好。但是,在Win8中,如果从上下文菜单调用此函数,则捕获的屏幕截图也会显示上下文菜单。它不会等待我的上下文菜单在截取屏幕截图之前消失。
为什么它在Win7中工作但不在Win8中工作?在拍摄截图之前,我如何等到上下文菜单消失?我试过了DoEvents
或UpdateLayout()
等几件事,但他们似乎没有帮助。
更新: 按照pushpraj的评论,我使用RenderTargetBitmap工作:
var bitmap = new RenderTargetBitmap((int)grid.ActualWidth, (int)grid.ActualHeight, 96, 96, PixelFormats.Default);
bitmap.Render(grid);
Clipboard.SetImage(bitmap);
除了一个问题外似乎有效。我的控件有一个浅色背景,当我粘贴剪贴板时会变成全黑。如果我将位图直接保存到文件中,我就不会遇到这个问题。怎么了?
更新2:
好的,对于使用RenderTargetBitmap
的背景问题,我在here找到了修复程序。