在 C# WinForm 中 window 后面截图

Take a screenshot behind window in C# WinForm

我正在使用 c# windows 表单开发一个应用程序,我有一个名为 Form1 的表单和一个按钮,在单击此按钮后,我的想法是截屏它后面的所有内容,但 Form1 除外本身(不最小化 Form1)。

有什么想法或建议吗?

谢谢!

你可以使用硬编码。实际上,light shot 和其他工具可以正常工作,例如。当您点击屏幕截图按钮时,您可以在活动结束后关闭表单 window 并重新打开它。这是解决问题的基本方法...... 请这样检查:How can i capture the screen without the Form?

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

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

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

限制:

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