如何隐藏自动化元素?

时间:2016-10-06 16:25:55

标签: c# google-chrome winapi ui-automation

我已经在这方面工作了几天,如果没有更多的确认或一些提示,关于这个任务下一步该怎么做。 我的任务是隐藏Chrome中的某些通知,Chrome无法提供隐藏的原生选项 - 即使在自助服务终端或隐身模式下也是如此。我一直使用的方法是Microsoft的Automation API来访问这些对象,这是相对容易的,因为我可以通过类名或对象中包含的一些文本找到它们 - 这是必要的。现在的挑战是我需要在不关闭Chrome的情况下隐藏元素和/或它的容器:)

很容易获得Chrome的主要处理:

 private IntPtr GetChromeHandle()
        {
            IntPtr chWnd = IntPtr.Zero;
            Process[] procsChrome = Process.GetProcessesByName("chrome");
            foreach (Process chrome in procsChrome)
            {
                // the chrome process must have a window
                if (chrome.MainWindowHandle == IntPtr.Zero)
                {
                    continue;
                }
                else
                {
                    chWnd = chrome.MainWindowHandle;
                }
            }
            return chWnd;
        } 

通过执行以下操作,我可以很容易地从这里获得其中一个元素:

PropertyCondition pcFullScreen = new PropertyCondition(AutomationElement.NameProperty, "F11", PropertyConditionFlags.IgnoreCase);
            AutomationElement fsTest = chromeWindow.FindFirst(TreeScope.Descendants, pcFullScreen);

这里的挑战是如何关闭该元素或导航到我可以关闭它的高级别?

尝试的替代方法如下所示:

PropertyCondition pcTest = new PropertyCondition(AutomationElement.ClassNameProperty, "Intermediate D3D Window");
            AutomationElement newTestElm = chromeWindow.FindFirst(TreeScope.Descendants, pcTest);

这里的问题是,虽然我可以隐藏/关闭"通过使用类的句柄,我似乎无法将其缩小到包含我正在寻找的文本的类的实例。任何建议都将不胜感激。

根据评论,尝试通过WindowPattern访问并获取" null"基于此代码:

private WindowPattern GetWindowPattern(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 (false == windowPattern.WaitForInputIdle(10000))
        {
            // Object not responding in a timely manner
            return null;
        }
        return windowPattern;
    }

0 个答案:

没有答案