首页 > 解决方案 > 在任何 UI 中识别可点击元素是否位于鼠标指针下方的方法

问题描述

我正在使用 C# 进行应用程序开发,我的要求是自动化鼠标点击任何可点击的项目。 例如,如果鼠标指针位于资源管理器或桌面中的任何图标上,或者认为鼠标指针位于任何应用程序的可点击项/UI 元素上的某个时间间隔(如 3 秒)的按钮上,我的应用程序应该会收到通知/回调或有什么方法可以识别图标是否在可点击的 UI 元素上或任何其他方式上。

标签: c#wpfwinforms

解决方案


在做了一些研究之后,我可以通过使用UI AUTOMATION来实现这一点,这要归功于@Fixation。我InvokePattern用于按钮、TextPatternEditBoxes 和TableItemPattern表格。

以下是代码:

static void main(int[] args)
{
    while (true)
    {
        System.Drawing.Point mouse = System.Windows.Forms.Cursor.Position; 
        AutomationElement element = AutomationElement.FromPoint(new System.Windows.Point(mouse.X, mouse.Y));
        if (element == null)
        {
            // no element under mouse
            return;
        }

        Console.WriteLine("Element at position " + mouse + " is '" + element.Current.Name + "'");

        object pattern;
        if (element.TryGetCurrentPattern(ValuePattern.Pattern, out pattern))
        {
            ValuePattern valuePattern = (ValuePattern)pattern;

            Console.WriteLine(" Value=" + valuePattern.Current.Value);
        }

        if (element.TryGetCurrentPattern(InvokePattern.Pattern, out pattern))
        {
            InvokePattern invokePattern = (InvokePattern)pattern;

            //invokePattern.Invoke();
            Console.WriteLine(" invokePattern=" + invokePattern.ToString());
        }

        if (element.TryGetCurrentPattern(TableItemPattern.Pattern, out pattern))
        {
            TableItemPattern tableItemPattern = (TableItemPattern)pattern;

            Mouse.MoveTo(new Point(mouse.X, mouse.Y));
            Mouse.Click(MouseButton.Left); // Install Microsoft.TestApi from Nuget

            Console.WriteLine(" TableItemPattern=" + tableItemPattern.ToString());
        }  
        Thread.Sleep(1000);
    }
}

希望这可以帮助!!!


推荐阅读