Я не знаком с тем, что возможно через Shell API, здесь , но я просто попробовал тест с МАУ. Я написал код ниже, чтобы получить доступ к заголовку, URL-адресу и окну, и он, похоже, работает нормально. Я запустил код, в то время как у Edge появилось несколько вкладок, а страница была Bing.com. Это данные, найденный с помощью теста ...
# кода C использует Interop DLL МАУ, что я сгенерированный с помощью инструмента TLBIMP.
В тестовом коде есть несколько предположений, которые могут потребоваться подтянуть, но в целом похоже, что они могут получить нужные вам данные. Если вы обнаружите, что этот код не работает для вас, если вы сообщите мне, какие именно элементы задействованы, я могу изучить его.
Спасибо,
Guy
IUIAutomationElement rootElement = uiAutomation.GetRootElement();
int propertyName = 30005; // UIA_NamePropertyId
int propertyAutomationId = 30011; // UIA_AutomationIdPropertyId
int propertyClassName = 30012; // UIA_ClassNamePropertyId
int propertyNativeWindowHandle = 30020; // UIA_NativeWindowHandlePropertyId
// Get the main Edge element, which is a direct child of the UIA root element.
// For this test, assume that the Edge element is the only element with an
// AutomationId of "TitleBar".
string edgeAutomationId = "TitleBar";
IUIAutomationCondition condition =
uiAutomation.CreatePropertyCondition(
propertyAutomationId, edgeAutomationId);
// Have the window handle cached when we find the main Edge element.
IUIAutomationCacheRequest cacheRequestNativeWindowHandle = uiAutomation.CreateCacheRequest();
cacheRequestNativeWindowHandle.AddProperty(propertyNativeWindowHandle);
IUIAutomationElement edgeElement =
rootElement.FindFirstBuildCache(
TreeScope.TreeScope_Children,
condition,
cacheRequestNativeWindowHandle);
if (edgeElement != null)
{
IntPtr edgeWindowHandle = edgeElement.CachedNativeWindowHandle;
// Next find the element whose name is the url of the loaded page. And have
// the name of the element related to the url cached when we find the element.
IUIAutomationCacheRequest cacheRequest =
uiAutomation.CreateCacheRequest();
cacheRequest.AddProperty(propertyName);
// For this test, assume that the element with the url is the first descendant element
// with a ClassName of "Internet Explorer_Server".
string urlElementClassName = "Internet Explorer_Server";
IUIAutomationCondition conditionUrl =
uiAutomation.CreatePropertyCondition(
propertyClassName,
urlElementClassName);
IUIAutomationElement urlElement =
edgeElement.FindFirstBuildCache(
TreeScope.TreeScope_Descendants,
conditionUrl,
cacheRequest);
string url = urlElement.CachedName;
// Next find the title of the loaded page. First find the list of
// tabs shown at the top of Edge.
string tabsListAutomationId = "TabsList";
IUIAutomationCondition conditionTabsList =
uiAutomation.CreatePropertyCondition(
propertyAutomationId, tabsListAutomationId);
IUIAutomationElement tabsListElement =
edgeElement.FindFirst(
TreeScope.TreeScope_Descendants,
conditionTabsList);
// Find which of those tabs is selected. (It should be possible to
// cache the Selection pattern with the above call, and that would
// avoid one cross-process call here.)
int selectionPatternId = 10001; // UIA_SelectionPatternId
IUIAutomationSelectionPattern selectionPattern =
tabsListElement.GetCurrentPattern(selectionPatternId);
// For this test, assume there's always one selected item in the list.
IUIAutomationElementArray elementArray = selectionPattern.GetCurrentSelection();
string title = elementArray.GetElement(0).CurrentName;
// Now show the title, url and window handle.
MessageBox.Show(
"Page title: " + title +
"\r\nURL: " + url +
"\r\nhwnd: " + edgeWindowHandle);
}
Спасибо Что касается Accessibility API: Я попытался с UI Automation, Вы правы, нет простого способа достичь URL-адреса. Еще более важно то, что когда я пытаюсь обходить дерево, API не возвращает те же элементы, которые отображаются в дереве Inspect. А также он имеет разные результаты. Один раз вы получаете элемент, а в следующий раз он пуст. Ни один из возвращаемых элементов не имеет типа управления. Возможно, что-то еще предстоит разработать командой разработчиков MS-Edge. .NET API: Я искал что-то вроде Shellwindows(), чтобы получить окно и URL-адрес с помощью .NET-класса. Есть ли какие-нибудь? – Waqas
На самом деле мне нужно три вещи за раз. 1- Окно, 2- Название, 3- URL. Мне нужно закрыть окно, если заголовок/URL совпадает с каким-то запросом. – Waqas