WPF-屏幕截图中显示的隐藏窗口

WPF-屏幕截图中显示的隐藏窗口,wpf,screenshot,Wpf,Screenshot,我的简单目标是截图。 我的应用程序有一个主窗口,有多种用途,其中一个是截图 我所做的是使用MainWindow隐藏窗口;然后显示处理截图过程的第二个窗口 this.Hide(); SnapshotManager snapshotMgr = new SnapshotManager(); snapshotMgr.Closed += SnapshotMgrClosed; snapshotMgr.Show(); 第二个窗口基本上是这样的: <Grid> <Image

我的简单目标是截图。 我的应用程序有一个主窗口,有多种用途,其中一个是截图

我所做的是使用MainWindow隐藏窗口;然后显示处理截图过程的第二个窗口

 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;
}