C# метка автоматизации пользовательского интерфейса

Я уже давно использую библиотеку Microsoft UI Automation, и мне удалось манипулировать текстовыми полями и кнопками. Однако у меня есть проблемы с некоторыми элементами управления.

У меня есть программа, которую я хочу автоматизировать, в которой есть поле с изображением и метка ссылки, которая работает как нажатие кнопки. Это означает, что если я нажму на поле с изображением или метку ссылки, я вызову событие и перейду на другую страницу.

Я попытался использовать метод вызова, у которого есть кнопки, но безуспешно. Есть ли другой способ вызвать событие щелчка или что-то подобное для поля изображения или метки ссылки?

Заранее спасибо.

Библиотека автоматизации пользовательского интерфейса Microsoft: http://msdn.microsoft.com/en-us/library/ms747327.aspx


person BecoZ    schedule 07.05.2011    source источник


Ответы (3)


‹‹ У меня есть программа, которую я хочу автоматизировать, в которой есть поле с изображением и метка ссылки, которая работает как нажатие кнопки >> - это звучит так, как будто это элемент управления изображением или меткой, который просто передает события нажатия мыши, но не в противном случае система узнает, что она ведет себя как кнопка. Лучше всего в подобных случаях использовать UIAutomation для получения ограничивающего прямоугольника, а затем использовать SendInput, чтобы переместить туда мышь и выполнить щелчок самостоятельно.

UIAutomation умеет работать только со стандартными кнопками. Все, что в основном является пользовательской кнопкой, например. метка, которая обрабатывает нажатие мыши — потребуется добавить поддержку некоторых дополнительных интерфейсов, чтобы сообщить UIAutomation, что на нее можно щелкнуть, и обеспечить поддержку самого метода Click.

person BrendanMcK    schedule 07.05.2011

Кнопки имеют метод PerformClick().

person IAbstract    schedule 07.05.2011
comment
Вопрос требует решения на этикетке, а не на кнопке. - person Veverke; 25.02.2020
comment
Возможно, кто-то из нас неправильно понял вопрос: Есть ли другой способ инициировать событие клика...? Мой ответ указывает на метод кнопки, который можно вызвать программно. - person IAbstract; 04.03.2020
comment
цитирование вопроса продолжается с ... для графического окна или метки ссылки ? Поэтому метод, доступный для кнопок, не помогает. Насколько я понимаю вопрос и ответ :) Кстати, я оказался в этом посте, потому что искал решение для лейбла... - person Veverke; 05.03.2020

Можно изменить поведение элементов управления Winforms в отношении автоматизации пользовательского интерфейса. Если вы хотите, чтобы PictureBox воспринимался автоматизацией пользовательского интерфейса как кнопка и, следовательно, на него можно было щелкнуть с помощью инструментов автоматизации пользовательского интерфейса, вы можете получить производные от PictureBox и переопределить методы Automation/Accessible примерно так:

До:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        var pb = new PictureBox();
        pb.Dock = DockStyle.Fill;
        pb.Click += (s, e) => MessageBox.Show("hello world");
        Controls.Add(pb);
    }
}

Вот как Inspect (из инструментов SDK) видит его как панель без каких-либо конкретных действий:

введите здесь описание изображения

После:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        var pb = new ButtonPictureBox();
        pb.Dock = DockStyle.Fill;
        pb.Click += (s, e) => MessageBox.Show("hello world");
        Controls.Add(pb);
    }
}

public class ButtonPictureBox : PictureBox
{
    protected override AccessibleObject CreateAccessibilityInstance() => new Accessible(this);

    private class Accessible : ButtonBase.ButtonBaseAccessibleObject
    {
        public Accessible(ButtonPictureBox control)
            : base(control)
        {
        }

        public new ButtonPictureBox Owner => (ButtonPictureBox)base.Owner;
        public override AccessibleRole Role => AccessibleRole.PushButton;
        public override AccessibleStates State => AccessibleStates.Default;
        public override void DoDefaultAction() => Owner.OnClick(EventArgs.Empty);
    }
}

Теперь Inspect видит его как кнопку, и доступен шаблон Invoke, поэтому, если вы его вызовете, будет вызван метод Click:

введите здесь описание изображения

person Simon Mourier    schedule 09.10.2020