1

我正在尝试使用托管 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++ 用于 UIA,这是我在 C# 中使用它时遇到的第一个区别。提前感谢您提供任何信息。

4

1 回答 1

0

我不确定为什么会发生这种情况,但是每当我将 UI 自动化代码提取到另一个类中并像这样调用它时,它就会起作用。我并不声称自己是 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)

任何关于为什么这有任何不同的见解将不胜感激:-)

于 2012-12-04T16:07:25.767 回答