c# FlaUi получает все значения из DataGridView другой программы - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь получить все значения из DataGridBox другой программы. Для этого я использую FlaUi. Я сделал код, который делает то, что я хочу. Тем не менее, это очень медленно. Есть ли более быстрый способ получить все значения из DataGridView другой программы с помощью FlaUi?

мой код:

var desktop = automation.GetDesktop();
                var window = desktop.FindFirstDescendant(cf => cf.ByName("History:  NEWLIFE")).AsWindow();
                var table = window.FindFirstDescendant(cf => cf.ByName("DataGridView")).AsDataGridView();

                int rowscount = (table.FindAllChildren(cf => cf.ByProcessId(30572)).Length) - 2;
                // Remove the last row if we have the "add" row

                for (int i = 0; i < rowscount; i++)
                {
                    string string1 = "Row " + i;
                    string string2 = "Symbol Row " + i;

                    var RowX = table.FindFirstDescendant(cf => cf.ByName(string1));
                    var SymbolRowX = RowX.FindFirstDescendant(cf => cf.ByName(string2));
                    SCAN.Add("" + SymbolRowX.Patterns.LegacyIAccessible.Pattern.Value);                    
                }

                var message = string.Join(Environment.NewLine, SCAN);
                MessageBox.Show(message);

Заранее спасибо

1 Ответ

1 голос
/ 07 января 2020

Поиск потомков довольно медленный, так как он будет go проходить через все объекты в дереве, пока не найдет нужный элемент управления (или не останется никаких элементов управления). Возможно, будет гораздо быстрее использовать шаблон сетки, чтобы найти нужные ячейки или получить все строки сразу и l oop через них.

В качестве альтернативы вы можете попробовать кэшировать, так как UIA использует межпроцессные вызовы, которые обычно медленны , Таким образом, каждый метод Find или свойство value выполняет такой вызов. Если у вас большая сетка, это может привести к довольно плохим результатам. Для этого случая использование UIA Caching может иметь смысл. Для этого вы получите все, что вам нужно (все потомки таблицы и шаблон LegacyIAccessible) в одном go внутри запроса кеша, а затем l oop через эти элементы в коде с CachedChildren и тому подобное. Простой пример этого можно найти в вики FlaUI по адресу https://github.com/FlaUI/FlaUI/wiki/Caching:

var grid = <FindGrid>.AsGrid();
var cacheRequest = new CacheRequest();
cacheRequest.TreeScope = TreeScope.Descendants;
cacheRequest.Add(Automation.PropertyLibrary.Element.Name);
using (cacheRequest.Activate())
{
    var rows = _grid.Rows;
    foreach (var row in rows)
    {
        foreach (var cell in row.CachedChildren)
        {
            Console.WriteLine(cell.Name);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...