赞
踩
QQ音乐和常规的windows软件不同,其内部只有一个Pane
,无法获取到内部按钮的自动化元素
,此时应该如何解决?对!模拟用户鼠标移动点击。模拟点击又会遇到新的问题:不同缩放下,鼠标移动的位置不同
,这个问题又该如何解决?本篇文章带你解决这些问题。
static void Main(string[] args) { var qqMusic = FlaUI.Core.Application.Launch("QQMusic_Setup_Home.20.05 (1).exe"); using (FlaUI.UIA3.UIA3Automation au = new UIA3Automation()) { Thread.Sleep(2000); var root = au.GetDesktop().FindFirstChild(t=>t.ByClassName("QQMusicinstallerClassName")); //点击安装 var rootRectangle = root.BoundingRectangle; ClickMousePosition(rootRectangle.X + 444, rootRectangle.Y + 534); Thread.Sleep(30000); ClickMousePosition(rootRectangle.X + 444, rootRectangle.Y + 591); Thread.Sleep(5000); Process.GetProcessesByName("QQMusic")?[0].Kill(); } } static void ClickMousePosition(int x,int y) { var factor = ScreenHelper.GetScalingFactor(); if (factor == 1) { Mouse.MoveTo(Math.Round(x / factor).ToInt(), Math.Round( y / factor).ToInt()); } else { Mouse.MoveTo(x, y); } Mouse.Click(); } public static float GetScalingFactor() { IntPtr dC = GetDC(IntPtr.Zero); int nIndex = 88; int deviceCaps = GetDeviceCaps(dC, nIndex); ReleaseDC(IntPtr.Zero, dC); return (float)deviceCaps / 96f; } [DllImport("gdi32.dll")] private static extern int GetDeviceCaps(IntPtr hdc, int nIndex); [DllImport("user32.dll")] private static extern IntPtr GetDC(IntPtr ptr); [DllImport("user32.dll")] private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
通过鼠标自动安装软件时,可能存在不同电脑分辨率不同的问题,需要调用win32API获取分辨率并计算。
除此外winform可感知DPI,需要新建app.manifest,并在里面添加如下配置
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。