Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2011, 20:51   #1
Snake_ua
Пользователь
 
Регистрация: 25.09.2007
Сообщений: 66
По умолчанию SendMessage и не только

Доброго времени суток. Уже долго бьюсь над одним вопросом, буду благодарен за любую помощь. Суть задачи в том, что необходимо программно вызвать другую программу и покликать на ней для отправки файла . Работаю в банке и этот процесс хочу автоматизировать.
Вызывается сторонняя программа и необходимо нажать на кнопку.
Код:
function Walk(Current: HWND; name: PChar): HWND;
var temp, rtn: HWND;
    WindowText: PAnsiChar;
begin
  temp:=GetWindow(Current, GW_CHILD);
  while (temp<>0) do
  begin
     GetWindowText(temp,WindowText,255);
     if StrComp(name,WindowText)=0 then
        begin
        Result:=temp;
        Exit;
        end;
     rtn:=Walk(temp,name);
     if (rtn<>0) then
        begin
        Result:=rtn;
        Exit;
        end;
     temp:=GetWindow(temp,GW_HWNDNEXT);
  end;
  Result:=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Phwnd, Chwnd: HWND;
begin
Phwnd := FindWindow(nil, 'Формування файлу @36 на рівні балансового відділення');
if Phwnd <> 0 then
  begin
  Chwnd := Walk(Phwnd, '&Сформувати файл звітності');
  SendMessage(Chwnd, BM_CLICK, 0, 0);
  end;
end;
Функцию Walk нашел у одного пользователя, не помню где и как ник... Было написано ни Си, портировал на делфи.

Цитата:
GetWindowText(temp,WindowText,255);
Не передает значение переменной WindowText. И не то, что пустая строка, она не задействована, и естественно следующая строка вызывает ошибку. Потом я взял и просто скопировал код в новый проект. Работает, находит кнопку, нажимает, но... Нажимая на кнопку, выскакивает дочернее окно этой сторонней программы, моя прога останавливается до тех пор, пока не будет закрыто данное окно, но там тоже надо нажать кнопки, думаю обойки с помощью потоков. Когда я закрывая это дочернее окно своими руками прога идет дальше и вылетает ошибка после SendMessage. Скрин ошибки прикрепил. Помогите мне разобраться, застрял тут прилично
Изображения
Тип файла: jpg error.JPG (19.9 Кб, 160 просмотров)
Snake_ua вне форума Ответить с цитированием
Старый 06.12.2011, 22:02   #2
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Используйте PostMessage()
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 06.12.2011, 23:10   #3
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Snake_ua

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

...

Функцию Walk нашел у одного пользователя, не помню где и как ник... Было написано ни Си, портировал на делфи.


не занимайтесь онанизмом оверкиллом, найдите лучше девушку, или хотя бы резиновую женщину:D возьмите AutoIt. В разы приятнее удобнее.
Rififi вне форума Ответить с цитированием
Старый 06.12.2011, 23:30   #4
Snake_ua
Пользователь
 
Регистрация: 25.09.2007
Сообщений: 66
По умолчанию

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
Используйте PostMessage()
Тот же трабл

Rififi

Спасибо за совет)) но увы, приходится заниматься всякой фигней)) Дело в том, что я уже написал код, что подготавливает файл к отправке и вызывает соответственно эту же прогу. Человеку остается лишь покликать... Но мне надоела эта процедура вовсе. Осталось всего-то программно покликать.. Но вот GetWindowText для меня загадка. В моей проге переменная WindowText не инициализируется. В ней не существует значения. Хотя в новом проекте работает...
Snake_ua вне форума Ответить с цитированием
Старый 06.12.2011, 23:39   #5
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Snake_ua

приходится заниматься всякой фигней

ну тогда через spy++ ищите классы/тайтлы нужных вам окон, дальше FindWindow, EnumChildWindows, ...

В моей проге переменная WindowText не инициализируется. В ней не существует значения. Хотя в новом проекте работает...

вообсЧе-то оно - указатель на char у вас... что уже неправильно, ибо надо TCHAR.
ну и память естессно не выделена... (((Ж
Rififi вне форума Ответить с цитированием
Старый 07.12.2011, 04:48   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
var WindowText: PAnsiChar;
...
GetWindowText(temp,WindowText,255);
Память под WindowText Дед Мороз выделять будет?

http://www.transl-gunsmoker.ru/2011/...tion-than.html
http://www.transl-gunsmoker.ru/2009/09/blog-post.html
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SendMessage(BSend, BM_CLICK, 0, 0); работает только если курсор находится над кнопкой Armorer Win Api 12 27.04.2021 10:40
Комментарии. Только при пин-коде. Почему работает только 1 пи код? Bushel PHP 1 23.10.2010 18:21
SendMessage Damien4Damien Общие вопросы Delphi 3 29.09.2010 21:27
Одни из jpg файлов реальные JPEG а другие только название. как загрузиь только картинки? AgressiveBehavior Общие вопросы Delphi 1 16.09.2009 09:39
начал учить только-только - нужна ваша помошь vanDJ Помощь студентам 20 18.12.2007 21:53