我已经在这方面工作了几天,如果没有更多的确认或一些提示,关于这个任务下一步该怎么做。 我的任务是隐藏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;
}