【发布时间】:2009-02-10 09:42:13
【问题描述】:
在 Windows 下使用 C++ 截取正在运行的应用程序的最佳(最简单)方法是什么?
【问题讨论】:
-
这个问题怎么跑题了?它询问如何以编程方式执行此操作,这对我来说似乎很相关(并且并不少见)。
标签: c++ windows screenshot
在 Windows 下使用 C++ 截取正在运行的应用程序的最佳(最简单)方法是什么?
【问题讨论】:
标签: c++ windows screenshot
您必须获取窗口的设备上下文 (GetWindowDC()) 并从中复制图像 (BitBlt())。根据您对应用程序的其他了解,您将使用不同的方法来查找要传递给GetWindowDC() 的窗口句柄。
【讨论】:
GetDC(NULL) + BitBlt()
要捕获半透明/alpha/分层窗口,您必须将CAPTUREBLT 标志传递给BitBlt,如果这样做,光标会闪烁,请阅读this technet article 找出原因。
在 NT6+ 上,您也许可以使用 Magnification API 来做您想做的事情。
【讨论】:
在keybd_event 函数文档中,它声明您可以使用它来截取屏幕截图并将其保存到剪贴板。例如:
keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_SILENT, 0);
在我的版本中(我的计算机上安装了 Visual Studio 2005 帮助),它指出您可以通过将第二个参数设置为 0 来截取整个桌面的屏幕截图,或者通过将其设置为 1 来截取当前应用程序的屏幕截图.
将其从剪贴板缓冲区中取出留作读者练习。
但是,在这样做之前我会仔细考虑,因为它会破坏剪贴板中已经存在的任何图像数据。
【讨论】:
这是一个例子code
您可以通过CaptureAnImage(GetDesktopWindow()); 进行屏幕截图。
【讨论】:
桌面是与用户交互的“虚拟”设备。因此,它可能包含与隐私相关的信息。我建议在可执行文件尝试截屏时添加来自操作系统的安全检查/警告提示,除非最终用户明确表示他(她)知道发生了什么。
【讨论】: