Я пытался использовать 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 «
Как мне правильно составить карту?
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
так как:
IUIAutomationElement
не определен в System.Windows.Automation
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, которая обеспечивает строгую типизацию, такая альтернатива несколько менее полезна.
Других решений пока нет …