C# 使用Flaui进行应用程序自动化 - 点击元素

前言
上一个章节写了如何通过鼠标点击的方式获取FlaUi元素。

具体查看文章:C# 使用Flaui进行应用程序自动化 - 选取元素

这篇文章写一下当获取到Flaui元素后,如何通过元素进行鼠标点击/模拟点击操作。

鼠标点击

  1. 首先可以直接使用AutomationElement里的Click函数,但是经过测试发现部分元素使用此函数会直接报错。
    在这里插入图片描述
  2. 由于内置的Click函数有可能出现报错的情况,所以使用WindowsApi来解决,可以灵活运用Api完成如鼠标双击、右击、移动鼠标等操作,文章里面示例了鼠标左键单击操作。
        [DllImport("user32.dll")]
        internal extern static bool SetCursorPos(int x, int y);

        [DllImport("user32.dll")]
        internal extern static void mouse_event(int a, int x, int y, int d, int e);

        [DllImport("user32.dll", EntryPoint = "ShowCursor", CharSet = CharSet.Auto)]
        internal static extern void ShowCursor(int status);

        [DllImport("user32.dll")]
        internal extern static IntPtr GetTopWindow();

        protected const int MOUSEEVENTF_MOVE = 0x0001;
        protected const int MOUSEEVENTF_LEFTDOWN = 0x0002;
        protected const int MOUSEEVENTF_WHEEL = 0x800;
        protected const int MOUSEEVENTF_LEFTUP = 0x0004;
        protected const int MOUSEEVENTF_RIGHTDOWN = 0x0008;
        protected const int MOUSEEVENTF_RIGHTUP = 0x0010;
        protected const int MOUSEEVENTF_MIDDLEDOWN = 0x0020;
        protected const int MOUSEEVENTF_MIDDLEUP = 0x0040;
        protected const int MOUSEEVENTF_ABSOLUTE = 0x8000;

        public static void Click(AutomationElement element)
        {
            Rectangle rect=element.BoundingRectangle;
            int X = rect.Left + rect.Width / 2;
            int Y = rect.Top + rect.Height / 2;
            Thread.Sleep(100);
            //光标定位到元素上
            SetCursorPos(X, Y);
            Thread.Sleep(100);
            //Make the left mouse down and up.
            //按下鼠标左键
            mouse_event(MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0);
            mouse_event(MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
        }

效果如下图:
在这里插入图片描述

模拟点击

有时存在Click或者WinAPI无法点击到元素的情况,示例:
我的电脑屏幕显示如下图所示
在这里插入图片描述当我选择网页下方的元素如下图所示,选择完成后,回到网页最上方

在这里插入图片描述

这时Click或者WindowsAPI就无法点击到。

在这里插入图片描述

            //判断元素是否支持模拟点击
            if (element.Patterns.Invoke.IsSupported && element.Patterns.Invoke.TryGetPattern(out var InvokePattern) && element.IsEnabled)
            {
                //模拟点击
                InvokePattern.Invoke();
            }

使用模拟点击,效果图如下所示.

在这里插入图片描述
使用模拟点击就能正常点击到按钮。


版权声明:本文为S1lenceAAA原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。