我正在尝试使用托管C ++中的UI自动化来查找ControlType.DataItem
控件的DataGrid
子项。以下代码段使用C#对已知的HWND
值进行操作:
var automationElement = AutomationElement.FromHandle(new IntPtr(0x000602AE));
var propertyCondition = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.DataItem);
var dataItems = automationElement.FindAll(TreeScope.Subtree, propertyCondition).Count;
Console.WriteLine("Found {0} DataItem(s)", dataItems);
这会产生以下输出:
Found 2 DataItem(s)
将代码转换为MC ++会产生零结果。这是转换后的MC ++代码:
auto automationElement = AutomationElement::FromHandle(IntPtr(0x000602AE));
auto propertyCondition = gcnew PropertyCondition(AutomationElement::ControlTypeProperty, ControlType::DataItem);
auto dataItems = automationElement->FindAll(TreeScope::Subtree, propertyCondition)->Count;
Console::WriteLine("Found {0} DataItem(s)", dataItems);
是否有其他人使用来自托管C ++的UI自动化遇到此问题?我过去曾使用过MC ++ for UIA,这是我在使用C#时遇到的第一个区别。提前感谢任何信息。
答案 0 :(得分:0)
我不确定为什么会发生这种情况,但每当我将UI Automation代码提取到另一个类并调用它时,它都能正常工作。我并不声称自己是MC ++的专家或者它如何加载.NET框架,但这就是我解决问题的方法。
AutomatedTable
类 AutomatedTable.h
#pragma once
using namespace System;
using namespace System::Windows::Automation;
ref class AutomatedTable {
public:
AutomatedTable(const HWND windowHandle);
property int RowCount {
int get();
}
private:
AutomationElement^ _tableElement;
};
AutomatedTable.cpp
#include "StdAfx.h"
#include "AutomatedTable.h"
AutomatedTable::AutomatedTable(const HWND windowHandle) {
_tableElement = AutomationElement::FromHandle(IntPtr(windowHandle));
}
int AutomatedTable::RowCount::get() {
auto dataItemProperty = gcnew PropertyCondition(AutomationElement::ControlTypeProperty, ControlType::DataItem);
return _tableElement->FindAll(TreeScope::Subtree, dataItemProperty)->Count;
}
main.cpp
main.cpp
#include "stdafx.h"
#include "AutomatedTable.h"
int main(array<System::String ^> ^args) {
auto automatedTable = gcnew AutomatedTable((HWND)0x000602AE);
Console::WriteLine("Found {0} DataItem(s)", automatedTable->RowCount);
return 0;
}
Found 2 DataItem(s)
任何有关为何与众不同的见解都会非常感激: - )