【问题标题】:How to know if the dialog box is closed completely?如何知道对话框是否完全关闭?
【发布时间】:2015-04-17 21:49:17
【问题描述】:

我有一个父表单Form1,它以全屏模式打开。 Form1 中有一个按钮,可以打开一个表单 Form2(使用 .ShowDialog() 方法)。当表单关闭时,程序会截取Form1 的屏幕截图。但在屏幕截图中,我仍然可以看到Form2,它在关闭期间仍然有一些不透明度(我正在使用Microsoft Windows 7 Pro,它通过降低表单的不透明度来动画关闭表单)。

那么我如何知道Form2 何时100% 关闭,以便我可以截取程序的屏幕截图?

编辑:我在Form1 中使用Graphics.CopyFromScreen Method 来截取屏幕截图。

Form2 是通过使用this.Close() 方法在Form2 中单击按钮关闭的。

【问题讨论】:

  • 你用什么方法关闭Form2?
  • 我认为这是因为 Windows 主题中的动画。您如何捕获 form1 的屏幕截图?
  • 您应该添加用于关闭表单的代码以及打开/截屏的代码(假设这是ShowDialog()
  • 等1秒再截屏怎么样?

标签: c# .net winforms showdialog


【解决方案1】:

如果有办法确定 Windows 桌面管理器动画已完成,则它不在 .NET 本身中。您必须找到一个提供此详细信息的本机 API(我不确定是否存在……我不知道是否存在)并通过 p/invoke 执行它。

我认为评论者/回答者 dotctor 提供了几个不错的选择:只需延迟足够长的时间以考虑动画,或者在关闭时将有问题的窗口移开(如果您确实重复使用相同的 @ 987654323@ 实例,在再次显示之前将其移回)。

也就是说,您也可以考虑使用Control.DrawToBitmap() 方法进行屏幕截图,因为您似乎希望图像是Form1 窗口的全屏图像。它有一些限制(您可以在文档中阅读),但只要这些都不适用于您的情况,它可能是获取您想要的图像的更方便的方法。

【讨论】:

  • 那么如何创建1秒的延迟呢?
  • Thread.Sleep(1000),在 UI 线程上调用它也不是一个好主意。 @L16H7
  • @L16H7:这是一个完全不同的问题! :) 您没有提供足够的代码示例来了解如何在 your 代码中创建延迟。例如,您可以使用 System.Windows.Forms.TimerTask.Delay() 之类的东西。
【解决方案2】:

我想出了一个无需等待的简单解决方案。

Form2 上的FormClosing 事件添加一个处理程序,并将其位置设置为屏幕外的某处。

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
   this.Location = new Point(-4000,-4000);
}

【讨论】:

  • 这会很烦人,但是如果你想重新打开同一个对话框
  • 可以存储之前的位置,然后在Shown@Sayse上恢复
  • @Sayse 如何重新打开已处理的对话框?无论如何,您都必须创建一个新的。
  • Thread.Sleep(1000) 解决了这个问题。感谢您的努力。
  • 我一直活在谎言中!
猜你喜欢
  • 1970-01-01
  • 2013-07-06
  • 2018-06-08
  • 2023-03-15
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多