Я пытался получить список подпунктов меню из стандартного приложения Windows, используя библиотеку UIAutomationCore, импортированную как TLB в Delphi, т.е.
File -> New | Exit
Help -> About
Я могу получить меню приложения, а затем элементы верхнего уровня в список (например, в приведенном выше примере «Файл» и «Справка», но я не могу получить список ЛЮБЫХ элементов управления, которые находятся под этими элементами меню. Мой код как показано ниже - FElement представляет фактический пункт меню, который я проверяю.
Длина коллекции, возвращаемой FindAll, всегда равна 0. Я пытался расширить элемент меню до этого кода, но, похоже, это не дало никакого эффекта.
UIAuto.CreateTrueCondition(condition);
FItems := TObjectList<TAutomationMenuItem>.create;
self.Expand;
sleep(3000);
// Find the elements
self.FElement.FindAll(TreeScope_Descendants, condition, collection);
collection.Get_Length(length);
for count := 0 to length -1 do
begin
collection.GetElement(count, itemElement);
itemElement.Get_CurrentControlType(retVal);
if (retVal = UIA_MenuItemControlTypeId) then
begin
item := TAutomationMenuItem.Create(itemElement);
FItems.Add(item);
end;
end;
Я вижу примеры этого на С#, и они на самом деле ничем не отличаются от приведенного выше кода (насколько я вижу)
заранее спасибо
Обновление: это очень похоже на этот вопрос.
Update2: в этом примере это делается для другого приложения Delphi. Однако, если я попробую то же самое в блокноте (например), возникнет та же проблема.
Update3: используя Inspect (а затем используя UI Automation), у меня есть следующая структура...
Имя = Выход Предки = Файл (меню) Форма1 (панель)
Я также пробовал это после расширения меню (файла), и то же самое происходит (или не происходит).