Найдите текстовое поле в другой форме и напишите в него

Использование VS2010 С#

Я в полной растерянности...

У меня есть программа поставщиков для экспорта данных в проприетарном формате в файл CSV.

У меня около 20 дисков и на одном из них 255 таких файлов...

Я хочу автоматизировать этот процесс... Это было довольно просто, пока мне не нужно было вводить новое имя файла в окно сохранения файла в программе поставщика.

У меня есть программа, но я не могу задать правильный вопрос (вопросы).

Я думаю, мне нужен способ перечислить все элементы управления, чтобы у меня был дескриптор для отправки сообщения.

Но, как я уже сказал, сейчас я в полной растерянности.

Предложения о том, какие вопросы задавать, будут наиболее оценены.

Спасибо!


person user3279899    schedule 14.07.2017    source источник
comment
Ты что-нибудь устал?   -  person Jack Miller    schedule 14.07.2017
comment
stackoverflow.com/questions/37912261/ не является ответом, но может помочь, также посмотрите на инструменты, созданные для этого. Раньше я делал это несколько лет назад (например, 15 лет назад), и я просто использовал инструменты сценариев, которые отправляли текст в окна и т. Д.   -  person Steve Drake    schedule 14.07.2017
comment
@Jack Miller Да, я часами пробовал различные образцы кода ... Большинство из них касалось того, как общаться с другими формами в вашем собственном проекте.   -  person user3279899    schedule 15.07.2017
comment
@ Стив Дрейк, я думаю, ты дал мне много пищи для размышлений и экспериментов. Выглядит очень интересно. Спасибо   -  person user3279899    schedule 15.07.2017


Ответы (2)


.FindAll() Должно быть то, что вы ищете. Это вернет все элементы пользовательского интерфейса под дескриптором окна. https://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.findall(v=vs.110).aspx

person Kieran Devlin    schedule 14.07.2017
comment
Киран Девлин... Я ценю, что вы нашли время, чтобы прочитать и ответить на мой вопрос. Но одна из причин, по которой многие из нас в конечном итоге задают вопросы на StackOverFlow, заключается в том, что информация Microsoft может быть довольно запутанной. :) - person user3279899; 15.07.2017
comment
Что у вас проблемы с пониманием? - person Kieran Devlin; 17.07.2017
comment
Представляет элемент модели автоматизации пользовательского интерфейса в дереве модели автоматизации пользовательского интерфейса и содержит значения, используемые в качестве идентификаторов клиентскими приложениями модели автоматизации пользовательского интерфейса. - person user3279899; 18.07.2017
comment
Таким образом, в основном для каждого пользовательского интерфейса существует дерево элементов пользовательского интерфейса, которые могут быть вложены друг в друга. (например, поле группы является дочерним элементом формы, а кнопка является дочерним элементом поля группы). Каждый узел элемента в дереве содержит атрибуты (значения), которые вы можете использовать для идентификации вашего элемента. Прокрутите список и проверьте относительное значение, то есть идентификатор дескриптора кнопки или текст. (например, для каждого элемента, если элемент является кнопкой и содержит текст «Нажмите на меня», а затем возвращает элемент). - person Kieran Devlin; 31.07.2017

Я решил, что обходной путь решит мою проблему и продолжит изучение позже...

Очень неприятно видеть, как легко это делается в AutoIt и Phantom Test Driver (именно это я и использовал).

[Веб-сайт удален, изменен.]

По сути, у меня была «тонна» дисков с файлами .dtb, а точнее 542.

Я знаю, что это упрощенно, и я только написал суть того, что я сделал, чтобы решить. Эти файлы имеют проприетарный формат, требующий использования программного обеспечения Teradyne, насколько мне известно, для использования этого программного обеспечения не существует сценариев или метода командной строки.

Я не уверен, что в итоге использовал все эти сборки, но вот список:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Runtime.InteropServices;

Моей первой задачей было найти все файлы .dtb на компакт-диске и перенести их в рабочую папку, сохранив структуру папок. (Потому что в разных папках были одинаковые имена файлов) Для этого я использовал Beyond Compare.

Эта папка становится базовой папкой lblDrive.txt. Он фактически включает в себя весь путь.

string[] rawInput = Directory.GetFiles(lblDrive.Text, "*.dtb*", SearchOption.AllDirectories);

//lblDTBFilesFound

int dtbCount = 0;
foreach (string s in rawInput)
{
    lstFilesList.Items.Add(s.ToString());
    dtbCount++;
}
lblDTBFilesFound.Text = "DTB Files Found: " + dtbCount.ToString();

// создать список всех файлов .dtb, включая их полный путь. // количество файлов можно использовать позже, чтобы убедиться, что вы преобразовали все файлы.

Перебрать список, копируя каждую запись в wrkString, которая представляет собой полный путь к файлу .dtb.

Clipboard.SetText(wrkString.Substring(0, q));

// Копируем все, кроме расширения файла, в буфер обмена

Process.Start(wrkString); // launching proprietary software

int maybe = 0;
while (maybe < 25)
{
    System.Threading.Thread.Sleep(10);
    maybe++;
}

// даем небольшую задержку, чтобы убедиться, что приложение запущено

var process = Process.Start("DTB_Extraction.psc");
process.WaitForExit();

• Запускает phantom.exe (.psc, ранее связанный с phantom.exe вручную) • Сценарий выполняет движения и щелчки мыши для преобразования файла • Сценарий включает вставку из буфера обмена в сохранение файла • Принудительно ожидает завершения сценария

if(File.Exists(wrkString.Substring(0, q) + ".csv"))
{
    // Do nothing
}
else
{
    lstDisp.Items.Add(wrkString.Substring(0, q) + ".csv");
}

// В редких случаях что-то пошло не так и .csv не был создан

string[] rawInput = Directory.GetFiles(lblDrive.Text, "*.csv*", SearchOption.AllDirectories);
int dtbCount = 0;
foreach (string s in rawInput)
{
    lstFilesList.Items.Add(s.ToString());
    dtbCount++;
}
lblCSVFilesFound.Text = "CSV Files Found: " + dtbCount.ToString();

// создать список всех файлов .csv в рабочем каталоге, чтобы я мог перебирать его и извлекать нужные мне данные. // Количество файлов можно сравнивать.

person user3279899    schedule 19.07.2017