【问题标题】:What is the best way to take screenshots of a Window with C++ in Windows?在 Windows 中使用 C++ 截取窗口的最佳方式是什么?
【发布时间】:2009-02-10 09:42:13
【问题描述】:

在 Windows 下使用 C++ 截取正在运行的应用程序的最佳(最简单)方法是什么?

【问题讨论】:

标签: c++ windows screenshot


【解决方案1】:

您必须获取窗口的设备上下文 (GetWindowDC()) 并从中复制图像 (BitBlt())。根据您对应用程序的其他了解,您将使用不同的方法来查找要传递给GetWindowDC() 的窗口句柄。

【讨论】:

  • 请添加更多关于如何使用 GetWindowDC 和 BitBlt 获取屏幕截图的详细信息。我也想要细节....
【解决方案2】:

GetDC(NULL) + BitBlt()

要捕获半透明/alpha/分层窗口,您必须将CAPTUREBLT 标志传递给BitBlt,如果这样做,光标会闪烁,请阅读this technet article 找出原因。

在 NT6+ 上,您也许可以使用 Magnification API 来做您想做的事情。

【讨论】:

  • 嗨,谢谢。现在我记得,我做过的一次导致鼠标指针闪烁的尝试是 GetDC()+BitBlt()。那是主要问题:(我不希望指针闪烁...有什么方法可以无缝地获取屏幕截图???
  • 只是不要传递 CAPTUREBLT 标志
【解决方案3】:

keybd_event 函数文档中,它声明您可以使用它来截取屏幕截图并将其保存到剪贴板。例如:

keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_SILENT, 0);

在我的版本中(我的计算机上安装了 Visual Studio 2005 帮助),它指出您可以通过将第二个参数设置为 0 来截取整个桌面的屏幕截图,或者通过将其设置为 1 来截取当前应用程序的屏幕截图.

将其从剪贴板缓冲区中取出留作读者练习。

但是,在这样做之前我会仔细考虑,因为它会破坏剪贴板中已经存在的任何图像数据。

【讨论】:

  • 这是键盘上 PrintScr 键的事件。您所说的“keybd_event”不能用于截屏。多么大的概念误解!
  • @Paul 点击我提供的链接并查看备注部分。它声明:“应用程序可以模拟按下 PRINTSCRN 键以获得屏幕快照并将其保存到剪贴板。为此,调用 keybd_event 并将 bVk 参数设置为 VK_SNAPSHOT。”
  • 哦好的我明白了,不知道我们可以模拟 printscr 键的按下 :)
【解决方案4】:

这是一个例子code
您可以通过CaptureAnImage(GetDesktopWindow()); 进行屏幕截图。

【讨论】:

    【解决方案5】:

    桌面是与用户交互的“虚拟”设备。因此,它可能包含与隐私相关的信息。我建议在可执行文件尝试截屏时添加来自操作系统的安全检查/警告提示,除非最终用户明确表示他(她)知道发生了什么。

    【讨论】:

    • 这并没有告诉 OP 如何编码截取屏幕截图...
    猜你喜欢
    • 2021-07-15
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2014-01-24
    • 1970-01-01
    • 2019-11-09
    相关资源
    最近更新 更多