通过迭代创建WinForm的自动屏幕截图';s的孩子来自“;外部“;应用程序的

本文关键字:孩子 应用程序 外部 屏幕截图 迭代 创建 WinForm | 更新日期: 2023-09-27 18:22:18

我想创建WinForm应用程序的自动屏幕截图。例如,我有一个包含TabControl和一些按钮的表单。然后在代码中,我想遍历Forms子级,通过它们的Location属性获取它们的位置,并在屏幕截图中突出显示它们。在这个例子中,我将使用TabControl,获取其活动页面,截屏整个应用程序,并在页面周围绘制一个矩形。

这完全可以通过添加一个自定义的"Screenshot"-UserControl来完成,但我想将其与应用程序的其他部分分开,比如有一个程序生成实际的Form,然后迭代其子级。

我目前的方法

  • 使用托管win-api作为PInvoke的包装器来遍历Form的句柄
    • 失败,因为我无法确定我得到了什么类型的控件(我使用了ClassName属性
  • 使用自定义AppDomain生成应用程序

我认为AppDomain是可行的,但我似乎找不到从自定义域中获取已实例化对象的方法。AppDomain.CreateInstanceAndUnwrap(string name, string type)创建了新的实例,所以我想这对我没有帮助。

AppDomain d = AppDomain.CreateDomain("CaptureDomain");
domain.ExecuteAssembly(path);
object[] o = domain.GetObjects(); // <-- like this
foreach (object k in o) 
{
    Console.WriteLine(o.GetType().Name);
     if (o is System.Windows.Forms.Form)
     {
         //iterate through children
     }
}

问题

如何自动制作应用程序的屏幕截图?

通过迭代创建WinForm的自动屏幕截图';s的孩子来自“;外部“;应用程序的

考虑一下UIA和MSAA(UIA的前身)API,它们都是Windows Automation API的一部分。该框架通常由UI测试自动化工具以及访问工具(屏幕阅读器等)使用,并且是从外部进程访问Winforms/WPF用户控件的推荐方式。

Windows自动化API

MSAA与UIA