自动安装QQ音乐
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>