Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Передать строку другому приложению


Автор: Alexzz 13.6.2010, 20:51
Есть совтинка, которая выполняет очень нужную задачу. Какую - не важно. У совтинки простой интерфейс, окошко на подобии Tedit, в которое нужно вбить строку из цифр, нажать Enter, дальше открываются ещё объекты на форме, которые трогать не нужно, просто ещё 2 раза нажать на Enter. Всё, задача запускается. 

Проблема заключается в том, что задача выполняется минуты 3-4, затем нужно вбить следующее число и снова трижды нажать Enter. Таких чисел ещё порядка тысячи и они перечислены в файле. 

Требуется написать маленькую програмульку, которая бы автоматизировала процесс. Предполагаю, что возможно каким-то образом передать другому приложению цепочку как-бы нажатых клавиш. Ведь когда всё подвисает, всё нажатое на клавиатуре где-то сохраняется в каком-то буфере и после развисания всё что было нажато "вылетает". Вот если бы просто вдувать в этот буфер клавиатуры строку из нескольких цифр и трёх ентеров. Типа это всё было нажато с клавы.

Наверняка есть возможность и напрямую заполнять Tedit.text, но так как совтинка чужая и что в ней как названо неизвестно, думаю это будет сложнее.

Автор: Keeper89 13.6.2010, 20:59
Сперва нужно посмотреть, что это за окошко, с помощью, например, http://www.catch22.net/software/winspy.
После этого, брать хендл окошка и посылать туда текст и нажатие клавиш.
Относительно времени - можно смотреть либо в сторону 5-ти минутного ожидания, либо определять это каким-либо образом в самой сторонней программе.

Автор: Alexzz 14.6.2010, 01:09
Спасибо, но это как раз длинный путь. Проторчал весь вечер в гугле, перепробовал массу разных вариантов, всё например на блокнот работает а вот на эдит - нет.  В конце концов нашёл вот такой вариант:
Код
var z: taginput;
zz: tagkeybdinput;
s: string;
begin
      s:=s+chr(13);
      while s<>'' do begin
        zz.wVk:=ord(s[1]);
        zz.wScan:=0;
        zz.dwFlags:=0;
        zz.time:=0;
        zz.dwExtraInfo:=0;
        z.Itype:=1;
        z.ki:=zz;
        Sendinput(1,z,sizeof(z));
        delete(s,1,1);
      end;
      sleep(4000);
      Sendinput(1,z,sizeof(z));
      sleep(100);
      Sendinput(1,z,sizeof(z));
end;

Тут не весь код, только то что относится к отправке строки другой программе.
Изначально s - строка, которую нужно отправить. Всю строку и код клавиши Enter посылаем сразу, затем ещё через 4 секунды посылаем ещё 2 раза клавишу Enter. Вот такой вариант срабатывает на самых разных текстовых полях, и в мемо и в едитах и в комбобоксах, везде где пробовал. Да, после запуска этой проги, нужно быстро активировать другую программу и установить курсор на первое поле ввода. Для этого предусмотрел задержку 5 секунд. Ну а следующее заполнение просто по таймеру, через 3 минуты и все дела. Проверил - хватает.
Поставлю на ночь, пусть выполняет мою работу.  smile 

Автор: Keeper89 14.6.2010, 02:06
Это, конечно, тоже решение, но какое-то стремное оно smile

Автор: Alexzz 14.6.2010, 23:14
Но ведь работает! 
Сегодня уже сделал большую часть работы, при этом сам плевался в потолок, тоесть занимался другим полезным делом.

Добавлено через 4 минуты и 22 секунды
Единственное добавил sleep(100) сразу после Sendinput. Иначе бывало что не все символы впечатывались, особенно если срабатывала подсказка (выпадало меню со старыми введёнными кодами) то несколько символов пропадало. А так, символы идут с небольшим интервалом и всё успевает нормально срабатывать. Ну и на вид эффектнее.

Автор: Keeper89 15.6.2010, 00:18
Цитата(Alexzz @  14.6.2010,  23:14 Найти цитируемый пост)
Но ведь работает! 

По поводу http://www.gunsmoker.ru/2010/05/blog-post_25.html smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)