Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Эмулирование действия пользователя, Считывает даных из одной программы друго 
:(
    Опции темы
Prospekt
Дата 22.12.2012, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 30.5.2012

Репутация: нет
Всего: 1



Задача для меня очень необычная, подозреваю, что решения может и не быть.

Есть программа, написаная не мной, скорее всего на Delphi (или CBuilder). Мне требуется сделать надстройку над этой программой, не перекомпилируя её. Что должна делать программа:
1) считывать данный из Label, расположение на экране которых известно и постоянно.
2) отправлять сообщения нажатия кнопок (расположение которых тоже известно).

Как подойти к этой задаче? Просто её интерфейс очень неудобен, данные представлены в том виде, в котором их неудобно обрабатывать, плюс необходимо постоянно иметь несколько сложных условий (критериев) построенных на этих даных. Да и ко всему ещё есть отрезки времени, когда от пользователя требуется примитивная реакция (если больше жмем на одну кнопку, если меньше на другую), так что хотелось бы построить некий автопилот для таких отрезков.

Почему я думаю, что эта задача может иметь решение? Есть такая программа как героекополка (для Heroes 3), которая автоматичеки загружает сейф, покупает в таверне героя, и если новый герой (на месте купленного) не тот, который нужен, происходит опять загрузка сейфа и т.д.
PM MAIL   Вверх
DarkProg
Дата 22.12.2012, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 2
Всего: 19



Для этого вам нужно отправить "другой" програмке соответствующее сообщение используя функцию SendMessage MSDN.

Координаты мыши узнать легко, а вот нажатие левой кнопки мыши выполняется вот так.

Код

    //нажимаем левую кнопку мыши по координатам
    SendMessage(hwnd,WM_LBUTTONDOWN,MK_LBUTTON,MAKELONG(pt.x,pt.y));
    //отпускаем левую кнопку мыши по координатам
    SendMessage(hwnd,WM_LBUTTONDOWN,0,MAKELONG(pt.x,pt.y));


WinAPI одинаково на всех языках, так что примеры можете смотреть на любом языке, суть от этого не меняется.
Главное понимать что искать. Удачи.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
Vas
Дата 22.12.2012, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 4
Всего: 28



Цитата(DarkProg @  22.12.2012,  13:08 Найти цитируемый пост)
Координаты мыши узнать легко, а вот нажатие левой кнопки мыши выполняется вот так.

Нафига ему координаты мыши?

Надо искать окно, например, по заголовку, что-то из раздела FindWindow, а потом, перебирая дочерние окна, находить их Handle и слать уже сообщение по SendMessage

Добавлено через 8 минут и 37 секунд
Вот когда-то в молодости писал, запуск приложения в режиме SW_HIDE, поиск окна по заголовку, потом поиск дочерних окон, если их класс (TEdit, запускаемые проги были писаны на дельфях, но не мной) то запоминаем и уже им шлем нужные параметры smile 
P.S. за код не ругать, давно это было  smile 
Код

Var
    hWnd,hList,hPass:THandle;
    Temp:PChar;
    Control:array [0..127] of char;
    counter,count:integer;
    UserName,UserPass:string;
Begin
     OkBtn.Enabled:=False;
     counter:=0; count:=0; hPass:=0;
     ShellExecute(Handle,'open',PChar(FileStr),nil,nil,SW_HIDE);
     repeat
           hWnd:=FindWindow(nil,'Connect');
           Application.ProcessMessages;
     until hWnd<>0;
     SetWindowText(hWnd,PChar('Соединение с базой: '+ListBox1.Items[ListBox1.ItemIndex]));
     ShowWindow(hWnd,SW_RESTORE);
     repeat
           hList:=GetWindow(hWnd, GW_CHILD);
           Application.ProcessMessages;
     until hList<>0;
     While (Counter<>2) AND (Count<>10)  do
           begin
                if hList<>0 then
                   GetClassName(hList, Control, SizeOf(Control))
                else
                    Control:='';
                if (Control='TEdit') OR (Control='Edit') then
                    begin
                         counter:=counter+1;
                         if counter=1 then
                            hPass:=hList;
                    end;
                if Counter<>2 then
                   hList:=GetWindow(hList, GW_HWNDNEXT);
                Count:=Count+1;
           end;
     if Counter=2 then
        begin
             UserName:=GetPassString('******','UserName','');
             Temp:=StrNew(PChar(UserName));
             SendMessage(hList,WM_SETTEXT,0,integer(Temp));
             StrDispose(Temp);
             UserPass:=GetPassString('*******','AutoSave','');
             UserPass:=Coder(UserPass);
             Temp:=StrNew(PChar(UserPass));
             SendMessage(hPass,WM_SETTEXT,0,integer(Temp));
             StrDispose(Temp);
//             ActivateKeyboardLayout(latin,KLF_REORDER);
       end
     else
         ShowMessage('Не могу передать имя пользователя!');
//     StatusBar1.SimpleText:=IntToStr(hWnd)+' '+IntToStr(count)+' '+IntToStr(Counter)+' '+IntToStr(hList)+' '+Control;
     OkBtn.Enabled:=True;



--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Prospekt
Дата 23.12.2012, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 30.5.2012

Репутация: нет
Всего: 1



Спасибо за ответы.

Я сделал так:
1) Сначало вывел список всех окон, и среди них нашел нужное окно типа MainForm.
2) Путем рекурентного поиска выводил все подокна для даного окна. Таким образом вывел дерево графических объектов для начального окна.
Но тут загвоздка, FindWindowEx() принципиально не хочет находить Label, а именно они мне очень нужны.
Почитал немного, оказалось, что Label - это типа как и не окно (вобщем Гейтс и здесь кинул), и таким образом получить handle не получится.
И что делать? Должен же быть какой-то способ добраться до этих Label. Как это сделать своими силами разобраться не могу.

Пардон, это уже другая тема, поэтому создам тему в соотвествующей ветке форума.

Это сообщение отредактировал(а) Prospekt - 23.12.2012, 13:23
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0759 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.