自动截取程序窗口的屏幕截图

Posted

技术标签:

【中文标题】自动截取程序窗口的屏幕截图【英文标题】:Automatically taking screenshots of program window 【发布时间】:2011-06-12 17:05:33 【问题描述】:

我正在寻找一种将宏录制与截屏功能相结合的软件。

我们有一个包含许多屏幕截图的软件手册。当新版本的软件发布时,我们需要更新大部分屏幕截图,我们必须手动完成。现在我们开始将手册翻译成多种语言,截图数量增加了十倍。我们想自动化这个过程。

将有一个录制的宏或点击我们软件中的按钮并截取程序窗口的东西。更好的是,我们可以单独指定每个屏幕截图的名称,尽管它不太重要。

这样的事情存在吗?

【问题讨论】:

我建议您在此特定场景中以 Microsoft UI 自动化 API 为目标,因为您拥有完整的源代码并支持组织中的应用程序生命周期。您需要记录 UI 脚本,使用自定义自动化提供程序,能够记录和回放 UI 自动化,然后您可以添加您的自定义行为,如屏幕截图,因为自动化 api 有 3 种方式来以编程方式评估 UI:通过 AutomationId 属性,通过使用屏幕点(鼠标点击)和可视化树项(UI 遍历)。 【参考方案1】:

我使用AutoIt 加上captdll.dll 来完成我所有的Windows GUI 自动化任务。

例子:

Run("Notepad.exe", @WindowsDir, @SW_MAXIMIZE)   ; Open NOTEPAD
Sleep(1000)
Send("Just a Test")   ; Send some text to notepad

; Save the screen to test.jpg  
$anPos = WinGetClientSize("")
$nLeft = 0
$nTop = 0
$nRight = $anPos[0]
$nBottom = $anPos[1]

$sFileName = "test.jpg"
DllCall("captdll.dll", "int:cdecl", "CaptureScreen", "str", $sFileName, "int", 85)

这样您就可以自动化整个截屏过程:

使用 Run 启动您的应用程序 使用发送选择每个菜单选项 也可以使用 Send 完成每个屏幕的数据 使用 DllCall("captdll.dll" ....) 捕获

还可以添加条件逻辑、循环等

【讨论】:

【参考方案2】:

是的。您需要自动化测试软件,它可以完成所有这些工作并测试您的产品。

http://en.wikipedia.org/wiki/List_of_GUI_testing_tools

【讨论】:

很大程度上取决于您使用的工具。存在可以在从 Perl、Java、C#、VB 和 javascript 到 Ruby 的所有内容中编程的工具。以 AutoIt 为例,如以下问题所示:***.com/questions/370673/… Ben,我知道 GUI 测试工具。我的问题不是关于测试,尽管它很接近。问题是哪些软件可以遍历Windows软件并截取程序窗口。 @Sergey Kornilov:查看 Windows 自动化 API【参考方案3】:

Testing Anywhere 似乎具有您需要的功能。 他们网站上的一些话:

“强大的基于 GUI 的记录功能和无需编程的用户界面允许测试人员快速设置甚至是复杂的测试用例” ...

“可视化日志报告:Testing Anywhere 强大的可视化选项在运行时截取屏幕截图以创建可视化日志。” (see here)

您还可以尝试一些更简单且(更便宜!)的方法,例如 Jitbit Macro Recorder,它可以让您播放录制的宏(键盘和鼠标),然后使用宏中的 Shift-PrintScreen 键进行屏幕截图。它还有一个宏脚本编辑器。

【讨论】:

【参考方案4】:

如果它是一个网络应用程序,您可以使用Selenium。 Visual Studio 有一个类似的工具叫做 Test Automation FX

【讨论】:

【参考方案5】:

你可以查看现有的Windows Automation API : UI Automation,MSDN 文档

运行时要求

以下操作系统支持 UI 自动化:Windows XP、Windows Server 2003、Windows Server 2003 R2、Windows Vista、Windows 7、Windows Server 2008 和 Windows Server 2008 R2。

客户端应用程序,从简单的测试脚本到强大的记录和回放实用程序,可能需要访问当前未实例化的元素,例如文件打开对话框或菜单项,因此在 UI 自动化树中不存在。这些元素只能通过使用 UI 自动化属性(如 AutomationID、控制模式和事件侦听器)再现或“回放”特定的用户界面 (UI) 操作序列来实例化。有关使用 Microsoft UI 自动化根据用户与用户界面 (UI) 的交互生成测试脚本的示例,请参阅 Test Script Generator Sample。

您可以在现有的 Visual Studio 项目中使用AutomationIdProperty。

在测试应用程序中实现 UI 自动化

添加 UI 自动化参考。

此处列出了 UI 自动化客户端所需的 UI 自动化 dll。

UIAutomationClient.dll 提供对 UI 自动化客户端 API 的访问。

UIAutomationClientSideProvider.dll 提供自动化 Win32 控件的能力。请参阅标准控件的 UI 自动化支持。

UIAutomationTypes.dll 提供对 UI 自动化中定义的特定类型的访问。

添加 System.Windows.Automation 命名空间。

此命名空间包含 UI 自动化客户端使用 UI 自动化功能所需的所有内容,但文本处理除外。

添加 System.Windows.Automation.Text 命名空间。

此命名空间包含 UI 自动化客户端使用 UI 自动化文本处理功能所需的一切。

查找感兴趣的对照

自动化测试脚本在自动化树中定位代表感兴趣控件的 UI 自动化元素。

有多种方法可以通过代码获取 UI 自动化元素。

使用条件语句查询 UI。这通常是使用与语言无关的 AutomationIdProperty 的地方。 笔记 可以使用 UISpy.exe (UI Spy) 等工具获取 AutomationIdProperty,该工具能够逐项列出控件的 UI 自动化属性。

使用TreeWalker 类遍历整个 UI 自动化树或其子集。

跟踪焦点。

使用控件的 hWnd。

使用屏幕位置,例如鼠标光标的位置。

见Obtaining UI Automation Elements

获取控制模式

控件模式公开了功能相似控件的常见行为。

找到需要测试的控件后,自动化测试脚本会从这些 UI 自动化元素中获取感兴趣的控件模式。例如,用于典型按钮功能的 InvokePattern 控件模式或用于窗口功能的 WindowPattern 控件模式。

请参阅 UI 自动化控制模式概述。

自动化 UI

自动化测试脚本现在可以使用 UI 自动化控制模式公开的信息和功能从 UI 框架控制任何感兴趣的 UI。

相关工具和技术

有许多相关的工具和技术支持使用 UI 自动化进行自动化测试。

UISpy.exe (UI Spy) 是一个图形用户界面 (GUI) 应用程序,可用于为提供者​​和客户端开发和调试收集 UI 自动化信息。 UI Spy 包含在 Windows 软件开发工具包 (SDK) 中。

UIAutoCmd 是一个命令行工具,功能类似于 UI Spy。

MSAABridge 向 Active Accessibility 客户端公开 UI 自动化信息。将 UI 自动化连接到 Active Accessibility 的主要目标是让现有的 Active Accessibility 客户端能够与任何已实现 UI 自动化的框架进行交互。 安全

有关安全信息,请参阅 UI 自动化安全概述。

【讨论】:

【参考方案6】:

我尝试了很多,我认为真正脱颖而出的是Adobe (formerly Macromedia) Captivate。它非常昂贵(〜800美元),但值得每一分钱。

创建教程等需要几分钟而不是几小时。

【讨论】:

【参考方案7】:

我会使用开源工具 Sikuli。非常直接的脚本语言,或者您可以使用他们的类并编写自己的 java 代码。

这里是抓取屏幕一部分的文档: http://sikuli.org/docx/screen.html#capturing

好处是它在 Windows、Linux 和 Mac 上受支持!

【讨论】:

以上是关于自动截取程序窗口的屏幕截图的主要内容,如果未能解决你的问题,请参考以下文章

替代快速截取窗口的屏幕截图

功能齐全的屏幕截图C++实现详解

功能齐全的屏幕截图C++实现详解

弹出窗口的屏幕截图不清晰

即使窗口重叠,如何在 Qt(Python、Linux)中截取特定窗口的屏幕截图?

Chrome 扩展程序截取的屏幕截图 - 隐私风险?