Как использовать IUIAutomation :: ElementFromIAccessible метод в C #?

Я пытался использовать ElementFromIAccessible метод через:

 System.Windows.Automation;
...
[DllImport("UIAutomationClient.dll")]
public static extern int ElementFromIAccessible(
IAccessible accessible,
int childId,
[In, Out, MarshalAs(UnmanagedType.IUnknown)] ref AutomationElement element);

где AutomationElement из System.Windows.Automation,

И когда я пытаюсь назвать это как:

 Win32.ElementFromIAccessible(this.Accessible, 0, ref automaitonElement);

Это не с

«System.Runtime.InteropServices.MarshalDirectiveException» «Невозможно
Пакет № 3 «

Как мне правильно составить карту?

3

Решение

TL; DR; по сути, это терпит неудачу, потому что вы пытаетесь p-вызвать несуществующий нативный метод, а также что вы пытаетесь использовать p-invoke в библиотеке COM. COM нет (кроме DllRegisterServer а также DllRegisterServer) все равно перечислите методы класса в таблице экспорта DLL. Там нет такой функции под названием ElementFromIAccessible() в UIAutomationClient.dll. Однако есть член интерфейса.

Как использовать IUIAutomation :: ElementFromIAccessible метод в C #?

IUIAutomation и т.п. являются типами COM, так что вы не следует использовать p-invoke. Вместо этого вы должны использовать COM-взаимодействие.

Во-первых, в вашем проекте добавьте COM-ссылку на UIAutomationClient v1.0:

введите описание изображения здесь

Затем, используя код, подобный следующему, вы создаете экземпляр для CUIAutomation и вызвать IUIAutomation.ElementFromIAccessible() метод:

CUIAutomation automation = new CUIAutomation();
IAccessible accessible = // you need to supply a value here
int childId = 0; // you need to supply a value here
IUIAutomationElement element = automation.ElementFromIAccessible(accessible, childId);

Как мне правильно составить карту?

Вы не можете разыграть IUIAutomationElement печатать в System.Windows.Automation так как:

  1. Один тип COM, а другой управляемый
  2. IUIAutomationElement не определен в System.Windows.Automation
  3. System.Windows.Automation.AutomationElement не осознает IUIAutomationElement (последний тип COM в любом случае)

Вы должны просто использовать COM UIA и воздерживаться от микширования и сопоставления. Также, согласно документу, COM UIA имеет больше возможностей, чем управляемая библиотека.

динамический

Вы можете использовать функции динамического вызова COM-объектов в .NET 4, используя IDispatch, например:

dynamic element = automation.ElementFromIAccessible (...);
string name = element.accName;

…однако автозаполнение не будет работать. Поскольку у вас уже есть доступ к библиотеке типов UIA через COM Reference, которая обеспечивает строгую типизацию, такая альтернатива несколько менее полезна.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]