C # AutomationElement - Получить все значки в трее, включая скрытые (Windows 10) - PullRequest
0 голосов
/ 08 марта 2019

Я использую следующий код, чтобы попытаться получить все значки в трее, в том числе скрытые в Windows 10.

    public static List<AutomationElement> EnumNotificationIcons()
    {
        var data = new List<AutomationElement>();

        foreach (var button in AutomationElement.RootElement.Find(
                        "User Promoted Notification Area").EnumChildButtons())
        {
            data.Add(button);
        }

        foreach (var button in AutomationElement.RootElement.Find(
                      "System Promoted Notification Area").EnumChildButtons())
        {
            data.Add(button);
        }

        var chevron = AutomationElement.RootElement.Find("Notification Chevron");
        if (chevron != null && chevron.InvokeButton())
        {
            foreach (var button in AutomationElement.RootElement.Find(
                               "Overflow Notification Area").EnumChildButtons())
            {
                data.Add(button);
            }
        }

        return data;
    }

Однако возвращаемый список содержит только видимые значки. Все скрытое пропускается. Скрытые значки в трее не возвращаются.

Что мне здесь не хватает?

EDIT:

Я обновил код, чтобы он выглядел следующим образом. Все еще не тянет скрытые значки. https://blogs.msdn.microsoft.com/oldnewthing/20141013-00/?p=43863

    public static IEnumerable<AutomationElement> EnumNotificationIcons()
    {
        var userArea = AutomationElement.RootElement.Find("User Promoted Notification Area");
        if (userArea != null)
        {
            foreach (var button in userArea.EnumChildButtons())
            {
                yield return button;
            }

            foreach (var button in userArea.GetTopLevelElement().Find("System Promoted Notification Area").EnumChildButtons())
            {
                yield return button;
            }
        }

        var chevron = AutomationElement.RootElement.Find("Notification Chevron");
        if (chevron != null && chevron.InvokeButton())
        {
            foreach (var button in AutomationElement.RootElement.Find("Overflow Notification Area").EnumChildButtons())
            {
                yield return button;
            }
        }
    }

1 Ответ

0 голосов
/ 08 марта 2019

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

    /// <summary>
    /// Enums the notification icons in the Tray.
    /// </summary>
    /// <returns>List of Notification Icons from the Tray.</returns>
    public static IEnumerable<AutomationElement> EnumNotificationIcons()
    {
        var userArea = AutomationElement.RootElement.Find(UINotificationAreaConstants.UserPromotedNotificationArea);
        if (userArea != null)
        {
            foreach (var button in userArea.EnumChildButtons())
            {
                yield return button;
            }

            foreach (var button in userArea.GetTopLevelElement().Find(UINotificationAreaConstants.SystemPromotedNotificationArea).EnumChildButtons())
            {
                yield return button;
            }
        }

        var chevron = AutomationElement.RootElement.Find(UINotificationAreaConstants.NotificationChevron);
        if (chevron != null && chevron.InvokeButton())
        {
            var elm = AutomationElement.RootElement.Find(
                                UINotificationAreaConstants.OverflowNotificationArea);

            WaitForElm(elm);

            foreach (var button in elm.EnumChildButtons())
            {
                yield return button;
            }
        }
    }

    /// <summary>
    /// Waits for elm to be ready for processing.
    /// </summary>
    /// <param name="targetControl">The target control.</param>
    /// <returns>The WindowPattern.</returns>
    private static WindowPattern WaitForElm(AutomationElement targetControl)
    {
        WindowPattern windowPattern = null;

        try
        {
            windowPattern =
                targetControl.GetCurrentPattern(WindowPattern.Pattern)
                as WindowPattern;
        }
        catch (InvalidOperationException)
        {
            // object doesn't support the WindowPattern control pattern
            return null;
        }
        // Make sure the element is usable.
        if (!windowPattern.WaitForInputIdle(10000))
        {
            // Object not responding in a timely manner
            return null;
        }
        return windowPattern;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...