【问题标题】:Take a screenshot behind window in C# WinForm在 C# WinForm 中的窗口后面截屏
【发布时间】:2021-11-07 18:00:24
【问题描述】:

我正在使用 c# windows 窗体中的应用程序,我有一个名为 Form1 的带有按钮的窗体,单击此按钮后的想法是对其背后的所有内容进行屏幕截图,除了 Form1 本身(不最小化 Form1) .

有什么想法或建议吗?

谢谢!

【问题讨论】:

  • 这个问题肯定被问过几百次了。请在再次询问之前做一些研究。
  • 我今天已经搜索了数百次,但从未得到答复。
  • 隐藏表格,做事件,拍照,显示表格。注意:隐藏表单不是关闭表单
  • 如果答案是系统没有提供可靠的方法来做到这一点,那么这就是答案。仅仅因为你不喜欢这个答案并不意味着你应该再次问同样的问题。系统不会因为你不断询问而神奇地改变。
  • this.Visible = false 构建 Bitmap,从中派生 Graphics 对象,[Graphics].CopyFromScreen(Point.Empty, Point.Empty, [Screen].Bounds.Size);(是 BitBlt + SourceCopy),this.Visible = true -- 略闪烁

标签: c# windows winforms


【解决方案1】:

如果您想要一个没有隐藏、移动、最小化等的解决方案,您需要以下方法:

  1. EnumWindows() 迭代所有窗口。这将为您提供从上到下的窗口。
  2. 别忘了排除您自己的窗口
  3. 排除不可见的窗口。查看GetWindowLongPtrGWL_STYLE 并与WS_VISIBLE 进行比较
  4. GetWindowRect() 获取它们的尺寸
  5. PrintWindow() 获取窗口的位图,不管它是否在后台
  6. 创建一个大小为VirtualScreen 的位图
  7. 使用DrawImage() 以相反的顺序(从下到上)绘制窗口

我发现这相当快(在 2560x1440 的屏幕上需要 514 毫秒,有 20 个可见窗口要绘制)。

限制:

  • 由于它向应用程序发送WM_PRINT 消息,因此您无法捕获“无响应”的应用程序
  • 对我来说,Firefox 的渲染效果不佳。它缺少页面内容。
  • 对我来说,控制面板内容显示为黑色,尽管在获取整个屏幕的屏幕截图时它就在那里。

【讨论】:

  • 这个想法听起来很棒,但如果能拍下整个 destkop 屏幕截图就更好了。不过我会测试这个建议的方法并看看。
  • @PierreSaintBermudez 整个桌面将包含您的表单。
  • 应用程序是否或如何实现其WM_PRINT 处理程序是每个应用程序做出的决定。不提供处理程序是一个常见的决定。预计这会失败。
【解决方案2】:

您可以使用硬编码。实际上轻拍和其他工具工作,例如。当您单击屏幕截图按钮时,您可以在事件结束后关闭表单窗口并重新打开它。这是解决的基本方法... 请通过以下方式查看:How can i capture the screen without the Form?

【讨论】:

  • hard code 是什么意思?是不是类似于“硬件”? :D 关闭和隐藏表单也有区别。您的答案应该是指向现有答案的评论,但您可能还不能这样做。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多