Как я могу использовать неуправляемый API автоматизации пользовательского интерфейса из PowerShell - PullRequest
0 голосов
/ 11 июня 2018

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

Я до сих пор не знаю, почему.

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Подход 2 Вы должны получить интерфейс

IID_IUIAutomation = "{30CBE57D-D9D0-452A-AB13-7AC5AC4825EE}"

CLSID_UIAutomationClient = "{944DE083-8FB8-45CF-BCB7-C477ACB2F897}"
;CoClasses
CLSID_CUIAutomation = "{FF48DBA4-60EF-4201-AA87-54103EEF594E}"

MS Doc состояний

Примечания

КаждыйКлиентское приложение автоматизации пользовательского интерфейса должно получить этот интерфейс к объекту CUIAutomation, чтобы получить доступ к функциям автоматизации пользовательского интерфейса.

Следующая функция примера создает объект CUIAutomation и получает интерфейс IUIAutomation.

IUIAutomation *g_pAutomation; 

BOOL InitializeUIAutomation() 
{ 
CoInitialize(NULL); 
HRESULT hr = CoCreateInstance(__uuidof(CUIAutomation), NULL, CLSCTX_INPROC_SERVER,  
    __uuidof(IUIAutomation), (void**)&g_pAutomation); 
return (SUCCEEDED(hr)); 
} 

Мне не удалось заставить его работать в PS, но, возможно, этот ответ помогает частично в правильном направлении (у меня это работает в AutoIt, но это работает по-другому, вы можете найти его с AutoIt IUIAutomation на Google)

$objCUI=[System.Runtime.InteropServices.Marshal]::GetTypeFromCLSID("30CBE57D-D9D0-452A-AB13-7AC5AC4825EE")

или

$Type = [Type]::GetTypeFromCLSID('30CBE57D-D9D0-452A-AB13-7AC5AC4825EE')
$objCUI = [System.Activator]::CreateInstance($Type)

оба запускаются, но когда я прихожу к

$rootEl = $objCUI.GetType().InvokeMember(
"GetRootElement", 
"InvokeMethod", 
$Null, 
$objCUI, 
@()
)  

я получаю ошибки

0 голосов
/ 14 июня 2018

Я еще не решил проблему, но наконец нашел альтернативу - C # Interactive.Я оставлю этот вопрос для пользователей PowerShell, но, если вы можете использовать C # Interactive в качестве альтернативы PowerShell, вам может помочь следующий раздел.

Подход № 5: C # Interactive

  1. Установите Visual Studio.
  2. Создайте Interop.UIAutomationClient.dll, следуя процедурам этого сообщения .
  3. Запустите следующий скрипт на csi.exe.
#r "Interop.UIAutomationClient.dll"
var uia = new UIAutomationClient.CUIAutomation();
var root = uia.GetRootElement();
var children = root.FindAll(UIAutomationClient.TreeScope.TreeScope_Children, uia.CreateTrueCondition());

К вашему сведению, C # Interactive работает, если в одной папке присутствуют только следующие файлы (т.е. вы можете использовать C # Interactive где угодно, просто доставив следующие файлы из среды разработки).

  • C:\Program Files (x86)\MSBuild\14.0\Bin\csi.exe
  • C:\Program Files (x86)\MSBuild\14.0\Bin\csi.rsp
  • C:\Program Files (x86)\MSBuild\14.0\Bin\Microsoft.CodeAnalysis.CSharp.dll
  • C:\Program Files (x86)\MSBuild\14.0\Bin\Microsoft.CodeAnalysis.CSharp.Scripting.dll
  • C:\Program Files (x86)\MSBuild\14.0\Bin\Microsoft.CodeAnalysis.dll
  • C:\Program Files (x86)\MSBuild\14.0\Bin\Microsoft.CodeAnalysis.Scripting.dll
  • C:\Program Files (x86)\MSBuild\14.0\Bin\System.AppContext.dll
  • C:\Program Files (x86)\MSBuild\14.0\Bin\System.Collections.Immutable.dll
  • C:\Program Files (x86)\MSBuild\14.0\Bin\System.Diagnostics.StackTrace.dll
  • C:\Program Files (x86)\MSBuild\14.0\Bin\System.IO.FileSystem.dll
  • C:\Program Files (x86)\MSBuild\14.0\Bin\System.Reflection.Metadata.dll
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...