#c# #ui-automation
#c# #пользовательский интерфейс-автоматизация
Вопрос:
Я уже довольно давно пользуюсь библиотекой автоматизации пользовательского интерфейса Microsoft и могу манипулировать текстовыми полями и кнопками. Однако у меня возникли проблемы с некоторыми элементами управления.
У меня есть программа, которую я хочу автоматизировать, в которой есть графическое окно и ярлык ссылки, которые функционируют как нажатие кнопки. Это означает, что если я нажму на поле с изображением или ярлык ссылки, я инициирую событие и буду перенаправлен на другую страницу.
Я пытался использовать метод invoke, который есть у кнопок, но безуспешно. Есть ли какой-либо другой способ вызвать событие click или что-то подобное для графического поля или ярлыка ссылки?
Заранее спасибо.
Библиотека автоматизации пользовательского интерфейса Microsoft: http://msdn.microsoft.com/en-us/library/ms747327.aspx
Ответ №1:
<< У меня есть программа, которую я хочу автоматизировать, в которой есть графическое поле и ярлык ссылки, которые функционируют как нажатие кнопки >> — звучит так, как будто это элемент управления изображением или меткой, который просто передает события мыши, но никак иначе не сообщает системе, что он ведет себя как кнопка. В подобных случаях лучше всего использовать UIAutomation для получения ограничивающего прямоугольника, а затем с помощью SendInput переместить туда мышь и самостоятельно выполнить щелчок.
UIAutomation знает только, как обращаться со стандартными кнопками. Все, что в основном является пользовательской кнопкой — например, ярлык, который управляет наведением курсора мыши, — должно было бы добавить поддержку некоторых дополнительных интерфейсов, чтобы сообщить UIAutomation, что на нее можно нажать, и обеспечить поддержку самого метода Click.
Ответ №2:
У кнопок есть PerformClick()
метод.
Комментарии:
1. Вопрос требует решения на ярлыке, а не на кнопке.
2. Возможно, кто-то из нас неправильно понял вопрос: » Есть ли какой-либо другой способ вызвать событие click … ?» Мой ответ указывает на метод на кнопке, который может быть вызван программно.
3. цитирование вопроса продолжается «… для графического поля или ярлыка ссылки «? Поэтому метод, доступный для кнопок, не помогает. Насколько я понимаю вопрос и ответ 🙂 Кстати, я попал на этот пост, потому что искал решение для ярлыка…
Ответ №3:
Можно изменить поведение элементов управления Winforms в отношении автоматизации пользовательского интерфейса. Если вы хотите, чтобы PictureBox отображался как кнопка с помощью автоматизации пользовательского интерфейса и, следовательно, был доступен для просмотра с помощью инструментов автоматизации пользовательского интерфейса, вы можете получить производное от PictureBox и переопределить автоматизацию / доступные методы, что-то вроде этого:
Перед:
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.Defau<
public override void DoDefaultAction() => Owner.OnClick(EventArgs.Empty);
}
}
Теперь Inspect видит его как «кнопку», и шаблон вызова доступен, поэтому, если вы вызовете его, будет вызван метод Click: