【问题标题】:How to use UIAutomation in .NET5 or .Net6如何在 .NET 5 或 .Net 6 中使用 UI 自动化
【发布时间】:2021-05-26 12:36:08
【问题描述】:

我创建了一个包含 7 个项目的 webApi 解决方案。

其中一个名为“FinanceApp.UIA”,下面是我在此项目中使用的 SDK。 请注意,其中包含“Microsoft.WindowsDesktop.App”,

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <FrameworkReference Include="Microsoft.WindowsDesktop.App" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="SimulateType\" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\FinanceApp.Comon\FinanceApp.Common.csproj" />
    <ProjectReference Include="..\FinanceApp.IRepository\FinanceApp.IRepository.csproj" />
    <ProjectReference Include="..\FinanceApp.Model\FinanceApp.Model.csproj" />
  </ItemGroup>
</Project>

为什么包含“Microsoft.WindowsDesktop.App”?以下是我想在这个项目中做的事情

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Automation;
using System.Threading;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;
using System.Runtime.InteropServices;
using FinanceApp.Common;

namespace FinanceApp.UIA
{
    public class BaseUia:IBaseUia
    {
        delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);

        [DllImport("user32.dll")]
        static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn,
            IntPtr lParam);

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern IntPtr GetHwndByClassName(string lpClassName, string lpWindowName);



        /// <summary>
        /// Get handles by process ID
        /// </summary>
        /// <param name="processId"></param>
        /// <returns></returns>
        public IEnumerable<IntPtr> GetHwndFromPid(int processId)
        {
            var handles = new List<IntPtr>();

            foreach (ProcessThread thread in Process.GetProcessById(processId).Threads)
            {
                EnumThreadWindows(thread.Id,
                    (hWnd, lParam) =>
                        {
                            handles.Add(hWnd);
                            return true;
                        },
                    IntPtr.Zero);
            }
            return handles;
        }

        /// <summary>
        /// Get AutomationElement by process id
        /// </summary>
        /// <param name="processId"></param>
        /// <returns></returns>
        public IEnumerable<AutomationElement> GetElementsByPid(int processId)
        {
            var handles = GetHwndFromPid(processId);
            return handles.Select(hnd => AutomationElement.FromHandle(hnd));
        }
    }
}

另一个名为“FinanceApp.Service”的项目,SDK和参考如下:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <LangVersion>Latest</LangVersion>
  </PropertyGroup>
  
  <ItemGroup>
    <ProjectReference Include="..\FinanceApp.UIA\FinanceApp.UIA.csproj" />
  </ItemGroup>

</Project>

我收到如下错误

目标平台必须设置为 Windows(通常包括 TargetFramework 属性中的“-windows”)在使用 Windows 窗体时 或 WPF,或引用项目或包 所以。 FinanceApp.Service C:\程序 Files\dotnet\sdk\6.0.100-preview.1.21103.13\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.DefaultItems.targets 362

【问题讨论】:

  • 似乎无法附上截图。
  • 像这样更改目标框架:&lt;TargetFramework&gt;net5.0-windows&lt;/TargetFramework&gt; 这是一个完整的控制台应用示例:pastebin.com/raw/AqBnQUsh
  • @WoodYANG 你没有提供任何代码甚至错误信息。您发布的错误消息部分似乎解释了您需要做什么
  • 添加代码,我想要的是将目标框架从.netcoreapp3.1更改为.net5,在这个项目中似乎没有错误,但是当我在另一个项目(.net5项目)中使用它时通过'添加项目引用',错误消息是'目标框架必须设置为Windows'
  • 请点击联动截图。它是解决方案结构。该代码是我在解决方案中的一个项目中所做的。该项目被另一个服务项目引用,如果我将TargetFramework更改为net5.0-windows,则表明该项目在服务项目中不兼容。

标签: c# ui-automation .net-5 asp.net5


【解决方案1】:

按照西蒙的建议,将解决方案中所有项目的目标框架更改为“net5.0-windows”,然后就解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-12
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多