在MC ++和C#之间使用FindAll for AutomationElement的不同行为

时间:2012-12-04 06:28:24

标签: c# ui-automation managed-c++ uia

我正在尝试使用托管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#时遇到的第一个区别。提前感谢任何信息。

1 个答案:

答案 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)

任何有关为何与众不同的见解都会非常感激: - )