Как узнать, что клиент автоматизации пользовательского интерфейса слушает мое приложение WPF - PullRequest
0 голосов
/ 18 мая 2018

Я хочу сделать свое приложение доступным (сделать мое приложение доступным для программ чтения с экрана, которые являются клиентом автоматизации пользовательского интерфейса, например "Narrator").

У меня есть ContentControl, что когда он получил фокус клавиатуры, я показываю всплывающую подсказку (беря ее из свойства Tooltip этого ContentControl).Это элемент управления, который используется многими способами, например, его можно использовать следующим образом: Content этого ContentControl является изображением значка вопросительного знака, а ToolTip является текстом справки ...

Вот код концепции:

class AutoTooltipOnFocus : ContentControl
{
    public AutoTooltipOnFocus()
    {
        this.GotKeyboardFocus += OnGotKeyboardFocus;
    }

    private void OnGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs keyboardFocusChangedEventArgs)
    {
        bool automationListens = AutomationPeer.ListenerExists(AutomationEvents.AutomationFocusChanged);

        if (automationListens)
        {
            // don't show tooltip because GetNameCore of MyAutoPeer will represent the ToolTip value
            return;
        }

        // show tooltip (by reading the ToolTip value of this AutoTooltipOnFocus)
    }

    protected override AutomationPeer OnCreateAutomationPeer()
    {
        return new MyAutoPeer(this);
    }
}

class MyAutoPeer : FrameworkElementAutomationPeer
{
    private AutoTooltipOnFocus _owner;

    public MyAutoPeer(AutoTooltipOnFocus owner)
        : base(owner)
    {

    }

    protected override string GetNameCore()
    {
        return GetToolTipValueFromOwner();
    }

    private string GetToolTipValueFromOwner()
    {
        // just for the simplicity of the example, I return this:
        return ToolTipService.GetToolTip(_owner).ToString();
    }
}

Narrator, например, считывает текстовое представление Content (скажем, свойство AutomationProperties.Name изображения установлено на «значок справки»"), а затем говорит" Подсказка: некоторый текст помощи ".

Я не хочу рассчитывать на подсказку, прочитанную всеми программами чтения с экрана (поправьте меня, если я ошибаюсь, думая, что некоторые из них нея прочитал подсказки), поэтому я заставил GetNameCore возвращать содержимое ToolTip, чтобы знать, что оно обязательно будет прочитано, и предотвратил появление подсказки (в обработчике OnGotKeyboardFocus), чтобы предотвратить двойное чтениетот же текст справки.

Проблема в том, что: я подумал, что запрос AutomationPeer.ListenerExists(AutomationEvents.AutomationFocusChanged) говорит мне, что автоматизация пользовательского интерфейса слушает мое приложение, но когда рассказчик не работает, этот метод возвращает «false», а в остальное время возвращаетtrue, поэтому подсказка не появляется, когда никто не использует программу чтения с экрана, поэтому мне нужно знать, каким образом можно указать, работает ли клиент автоматизации пользовательского интерфейса и прослушивает мое приложение.Может быть, есть обходной путь, добавив некоторый код в мой пользовательский AutomationPeer.

Спасибо, что уделили время!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...