前言
上一个章节写了如何通过鼠标点击的方式获取FlaUi元素。
具体查看文章:C# 使用Flaui进行应用程序自动化 - 选取元素
这篇文章写一下当获取到Flaui元素后,如何通过元素进行鼠标点击/模拟点击操作。
鼠标点击
- 首先可以直接使用AutomationElement里的Click函数,但是经过测试发现部分元素使用此函数会直接报错。
- 由于内置的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版权协议,转载请附上原文出处链接和本声明。