WPF-屏幕截图中显示的隐藏窗口
我的简单目标是截图。 我的应用程序有一个主窗口,有多种用途,其中一个是截图 我所做的是使用MainWindow隐藏窗口;然后显示处理截图过程的第二个窗口WPF-屏幕截图中显示的隐藏窗口,wpf,screenshot,Wpf,Screenshot,我的简单目标是截图。 我的应用程序有一个主窗口,有多种用途,其中一个是截图 我所做的是使用MainWindow隐藏窗口;然后显示处理截图过程的第二个窗口 this.Hide(); SnapshotManager snapshotMgr = new SnapshotManager(); snapshotMgr.Closed += SnapshotMgrClosed; snapshotMgr.Show(); 第二个窗口基本上是这样的: <Grid> <Image
this.Hide();
SnapshotManager snapshotMgr = new SnapshotManager();
snapshotMgr.Closed += SnapshotMgrClosed;
snapshotMgr.Show();
第二个窗口基本上是这样的:
<Grid>
<Image Name="MainImage" Stretch="None" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
</Image>
<Border BorderBrush="Transparent" BorderThickness="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Border.Background>
<SolidColorBrush Color="Black" Opacity="0.4"/>
</Border.Background>
</Border>
</Grid>
当用户点击一个按钮拍摄屏幕截图时,我隐藏了主窗口并显示了这个窗口。
然后我将屏幕保存到第二个窗口中的图像中,如下所示:
Bitmap snapshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics graphics = Graphics.FromImage(snapshot);
graphics.CopyFromScreen(new System.Drawing.Point(0,0), new System.Drawing.Point(0,0), Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
//-----------------------------------
// Save the screen to MainImage
//-----------------------------------
MemoryStream ms = new MemoryStream();
snapshot.Save(ms, ImageFormat.Bmp);
ms.Position = 0;
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.StreamSource = ms;
bi.EndInit();
MainImage.Source = bi;
问题是,由于某种原因,我的主窗口出现在屏幕截图中。
主窗口。隐藏可能不像我想的那样工作。
如何使用主窗口拍摄屏幕截图
谢谢大家!
编辑:
下面的代码可以工作,但使用了Sleep200,这是我真正想要避免的
private void OnTakeSnapshot(object sender, RoutedEventArgs e)
{
this.LayoutUpdated += RunSnapshotMgr;
this.Hide();
}
private void RunSnapshotMgr(object sender, EventArgs e)
{
if (IsVisible == true) return;
Thread.Sleep(200);
SnapshotManager snapshotMgr = new SnapshotManager();
snapshotMgr.Closed += SnapshotMgrClosed;
snapshotMgr.Show();
this.LayoutUpdated -= RunSnapshotMgr;
}
在捕获屏幕时,您的窗口可能还没有真正隐藏。您可以尝试在主窗口的某个IsVisibleChanged处理程序中添加捕获代码,检查IsVisibleChanged是否为false以运行代码。您应该首先注册处理程序,然后调用Hide。在处理程序中,在运行捕获代码后,应该注销处理程序。Hmm。。我试试看。Thanks@KingKing不起作用:
private void OnTakeSnapshot(object sender, RoutedEventArgs e)
{
this.LayoutUpdated += RunSnapshotMgr;
this.Hide();
}
private void RunSnapshotMgr(object sender, EventArgs e)
{
if (IsVisible == true) return;
Thread.Sleep(200);
SnapshotManager snapshotMgr = new SnapshotManager();
snapshotMgr.Closed += SnapshotMgrClosed;
snapshotMgr.Show();
this.LayoutUpdated -= RunSnapshotMgr;
}