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