API автоматизации пользовательского интерфейса для Windows доступен из двух библиотек DLL.Одним из них является управляемая DLL, которая является C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\UIAutomationClient.dll
.Другой - неуправляемая DLL, которая является C:\Windows\System32\UIAutomationCore.dll
.Согласно этой записи , неуправляемый API превосходит управляемый API по количеству видимых элементов, поэтому я хотел бы использовать неуправляемый API.
Я пробовал три подхода, но все они потерпели неудачу.Не могли бы вы сказать мне правильный подход?
Подход № 1: New-Object -ComObject
$uia = New-Object -ComObject <ProgID of CUIAutomation>
$root = $uia.GetRootElement()
Ошибка, потому что New-Object
требует ProgID, но CUIAutomation
делаетне имеет ProgID.
Подход № 2: Реализация из CLSID
CLSID CUIAutomation
равен ff48dba4-60ef-4201-aa87-54103eef594e
, затем
$type = [Type]::GetTypeFromCLSID("ff48dba4-60ef-4201-aa87-54103eef594e")
$uia = [Activator]::CreateInstance($type)
$root = $uia.GetRootElement()
, но завершился неудачно со следующимсообщение об ошибке.Я до сих пор не знаю, почему.
Method invocation failed because [System.__ComObject] does not contain a method named 'GetRootElement'.
At line:1 char:1
+ $root = $uia.GetRootElement()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
Подход № 3: Add-Type
Add-Type -Path "C:\Windows\System32\UIAutomationCore.dll"
$uia = New-Object UIAutomationClient.CUIAutomation
$root = $uia.GetRootElement()
Ошибка, поскольку Add-Type
ожидает управляемые библиотеки DLL.
Сообщение об ошибке:
Add-Type : Could not load file or assembly 'file:///C:\Windows\System32\UIAutomationCore.dll' or one of its dependencies. The module was expected to contain an assembly manifest. At line:1 char:1
+ Add-Type -Path "C:\Windows\System32\UIAutomationCore.dll"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Add-Type], BadImageFormatException
+ FullyQualifiedErrorId : System.BadImageFormatException,Microsoft.PowerShell.Commands.AddTypeCommand
Редактировать (2018-06-12)
Я попробовал другой подход.(и не удалось)
Подход № 4: Interop DLL
Я не совсем понимаю, что такое Interop DLL, но этот пост говорит, что Interop DLL помогла OP в любом случае,Я установил Visual Studio и сгенерировал Interop.UIAutomationClient.dll
, следуя процедурам, описанным в сообщении.
Add-Type -Path "Interop.UIAutomationClient.dll"
$uia = New-Object UIAutomationClient.CUIAutomationClass
$root = $uia.GetRootElement()
$children = $root.FindAll([UIAutomationClient.TreeScope]::TreeScope_Children, $uia.CreateTrueCondition())
Мне удалось получить $root
, но не удалось выполнить строку $children
со следующим сообщением об ошибке.
Method invocation failed because [System.__ComObject] does not contain a method named 'FindAll'.
At line:1 char:1
+ $children = $root.FindAll([UIAutomationClient.TreeScope]::TreeScope_C ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
Я до сих пор не знаю, почему.