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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват нажатия кнопки и подмена значения, в окне чужой программы 
:(
    Опции темы
Twiddle
  Дата 13.7.2009, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Приветствую уважаемые! Помогите самоучке решить сложную задачу. Заранее спасибо!
Есть программа с постоянным именем процесса. Заголовок окна всегда постоянный. На нем есть:
ComboBox, много Static, 2х Edit и 2 кнопки с постоянным заголовком. Задача:
Наша программа  висит просто в памяти возможно свернутая (не активно окно). Когда в чужой программе нажимается кнопка с текстом "Продолжить" то значение в первом эдите меняется на нужное нам; программно мышка кликает на одно из Static и после этого уже эти данные передаются дальше. Основная сложность в том что хендлы в чужой программе каждого элемента меняются. Возможно поможет то что статик по которому нужно кликнуть всегда начинается с "Привет:" а в эдите всегда присутствует первым символ либо "х", либо "у", либо "0" и следующий набор символов постоянный вернее не постоянный а постоянно их кол-во. Находить кнопки и нажимать их, ставить галочки итп я смог, а вот тут проблема. Если без использования DLL будет вообще супер. Один раз отлавливал нажатия клавиш не хуком а таймером - и код меньше и понравилось больше ;). Возможно ещё поможет то что нам известны размеры элементов и они все разные. Очень прошу не помидоров а помощи. 

Это сообщение отредактировал(а) Twiddle - 13.7.2009, 03:34
PM MAIL   Вверх
niteo
Дата 13.7.2009, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пробуй Субклассинг использовать.
--------------------
Мне чужого лишнего не нада.Ешь ананасы, рябчиков жуй,день твой последний приходит, буржуй...
PM MAIL   Вверх
Twiddle
Дата 13.7.2009, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 smile или ссылку где про это почитать. 
Спасибо.
Так, прозрение: а что если при появлении родительского окна (ловим по заголовку), отслеживаем нажатие на кнопку (постоянный заголовок у неё), как кнопка нажата успеваем в темп или буффер как правильно называется не знаю уж простите,загружаем все заголовки всех дочерних окон, ищем в этом по маскам нужное нам ("Привет:*" и "Х????????????") у найденого узнаем хендл, меняем в этих эдитах содержимое на то что нужно нам и собственно все готово. Только два вопроса: как реализовать и желательно без DLL и будет ли успевать все подменяться. 

Это сообщение отредактировал(а) Twiddle - 13.7.2009, 18:46
PM MAIL   Вверх
niteo
Дата 13.7.2009, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Это про Субклассинг для своего окна
    http://forum.vingrad.ru/forum/topic-69246.html
Гдето в этой же ветке было и про инжект в чужой процесс. Без использования DLL

Добавлено через 3 минуты и 37 секунд
Почему хук не юзаешь? Удобная весчь, проще субклассинка с инжектом. Вообще субклассинг нужно юзать для более "глобальных" вещей. Для всего остального сойдут и хуки.
--------------------
Мне чужого лишнего не нада.Ешь ананасы, рябчиков жуй,день твой последний приходит, буржуй...
PM MAIL   Вверх
Twiddle
Дата 13.7.2009, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Хук боюсь использовать потому что многие антивирусы будут ругаться, не хочется каждый раз выключать АнтиВирус. 
PM MAIL   Вверх
niteo
Дата 13.7.2009, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня ни НОД ни Каспер не ругаются. Они не могут на сам ХУК ругаться. Они ругаются только на КОД. ХУК это стандартнай виндовый инструмент.
--------------------
Мне чужого лишнего не нада.Ешь ананасы, рябчиков жуй,день твой последний приходит, буржуй...
PM MAIL   Вверх
Twiddle
Дата 13.7.2009, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну допустим будет хук. Это только пол беды. Основная беда в том что нам надо при нажатии кнопки заменть значения эдитов а определить хендл этих эдитов что бы это сделать у меня не получается т.к. там не постоянный заголовок, вернее постояннен только первый символ и общее кол-во. , а по классу не получается т.к. на форме чужой программы много объектов одного класса. =( Второй день уже одержим идеей, читаю вес мануалы, сейчас штрудирую форум, нашел много интерсеного но нужного пока пшик.. =( 
PM MAIL   Вверх
niteo
Дата 13.7.2009, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

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

  FindWindow

Цитата

  отслеживаем нажатие на кнопку (постоянный заголовок у неё), 


  SetWindowsHookEx

Цитата

  загружаем все заголовки всех дочерних окон, ищем в этом по маскам нужное нам ("Привет:*" и "Х????????????") у найденого узнаем хендл, меняем в этих эдитах содержимое на то что нужно  нам и собственно все готово


  EnumChildWindows

Этого будет достаточно ;)
 В EnumChildWindows заодно и значения будешь в Edit-ах менять

Это сообщение отредактировал(а) niteo - 13.7.2009, 19:24
--------------------
Мне чужого лишнего не нада.Ешь ананасы, рябчиков жуй,день твой последний приходит, буржуй...
PM MAIL   Вверх
Twiddle
Дата 13.7.2009, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нашел вот такой вот код может кому то же полезно будет. 
Код

function EnumChildProc(Wnd: hWnd; lParam: LongInt): Boolean; stdcall;
var
  Buff: array[0..MAXCHAR - 1] of Char;
begin
  Result := True;
  GetClassName(Wnd, Buff, MAXCHAR);
  if String(Buff) = PChar(lParam) then
    Result := Succeeded(SendMessage(Wnd, WM_SETTEXT, 0, Integer(PChar('1111'))));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  S: string;
begin
  S := 'TEdit';
  EnumChildWindows(FindWindow(nil, 'Form1'), @EnumChildProc, Integer(@S[1]));
end; 


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

PM MAIL   Вверх
Twiddle
Дата 15.7.2009, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот один человек за что ему спасибо подсказал как сделать, но мой мозг не может это превратить в код. Помогите пожалуйста, с меня пиво.
Цитата

Получаешь первое дочернее окно с помощью FindWindowEx или GetWindow с определенным параметром. Теперь repeat, получаешь заголовок, с помощью pos проверяешь наличие подстроки в заголовке, если есть то break. Теперь с помощью GetWindow получаешь следующее, потом until эта переменная равна нулю. В итоге получишь или хэндл в твоей переменной, или 0 если нет такого

и про хук нужной нам кнопки в нужном окне, хендл кнопки и окна находиться без проблем. Заранее спасибо. 
PM MAIL   Вверх
niteo
  Дата 15.7.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Блин, посмотри в DRKB. Там примеров по такой же теме полно. есть на 90% такие как тебе надо.
Все просто. Берешь ЧУЖОЕ окно. Ставишь на контрол ХУК. На каждое отрабатываение события, пробегаешься в цикле по УЖЕ ОТОБРАННЫМ контролам (Отобрать можешь их в EnumChildWindows, там в рекурсии отберешь какие надо контролы) smile
--------------------
Мне чужого лишнего не нада.Ешь ананасы, рябчиков жуй,день твой последний приходит, буржуй...
PM MAIL   Вверх
Twiddle
Дата 15.7.2009, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ладно с хуком потом, не могу понять в чем тут косяк?
Код

var
z1,z2,:pansichar;
zz:hwnd;
begin
z2:='Kitty';
z1:='Hello'+z2+'!'; // Error =(  wtf? 
zz:=findwindow(nil,z1);

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


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Код

var
z1,z2,:ansistring;
zz:hwnd;
begin
z2:='Kitty';
z1:='Hello'+z2+'!'; // Error =(  wtf? 
zz:=findwindow(nil,pansichar(z1));



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Twiddle
Дата 15.7.2009, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, осталось тока с хуком помучиться... =( 
PM MAIL   Вверх
Twiddle
Дата 22.7.2009, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Кто нить может конкретно помочь за хорошее пиво? Кто не пьет пиво можем  договориться yf аналогичное вознаграждение... =\ Тупо надо перехватить нажатие кнопки. При нажатии выполняется мой код который я уже написал с горем-пополам. Пасибо заранее... Писать можно в пм.
PS: не ругайтесь на меня  smile 
PM MAIL   Вверх
Keeper89
Дата 23.7.2009, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 14
Всего: 58



Конкретно помочь - это весь код написать? 
niteo, в принципе расписал последовательность действий, осталось только поискать примеры.
З.Ы. Кстати с каким приложением идет работа если не секрет?


--------------------
PM MAIL WWW   Вверх
niteo
Дата 23.7.2009, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Чуть грубовато, но.. это глобальный хук на мышку и клаву.
По событию, делаешь WindowFromPoint и юзаешь..

Код

function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
  msg: PEVENTMSG;
begin
  if Code >= 0 then begin
     result := 0;
     msg := Pointer(LParam);
     with Form1 do
       case msg.message of
         WM_MOUSEMOVE: ;// Двигаем мышой msg.ParamL - это Х msg.ParamH - Это У
         WM_LBUTTONDOWN: ;// Нажали ЛКМ
         WM_LBUTTONUP:   ; // Отпустили ЛКМ
         WM_RBUTTONDOWN: ; // Нажали ПКМ
         WM_RBUTTONUP:   ; // Отпустили ПКМ
         WM_KEYUP:       ;// Отпустили кнопочку
         WM_KEYDOWN:   ;// Нажали кнопочку
       end;
  end else
     result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, HInstance, 0);
  if HookHandle = 0 then
    MessageDlg(IntToStr(GetLastError), mtInformation, [mbOK], 0);
end;



С локальным хуком, чтобы его привязать на какое то не свое приложение, тебе прийдется делать DLL. Весь вышеперечисленный код переносишь в DLL и все...

Код

library MegaHook;
uses
  Windows, Messages;
var
  SysHook: HHook = 0;

function SysMsgProc(Code: Integer; WParam: LongInt; LParam: LongInt): LongInt; stdcall;
begin
  if Code > 0 then
  begin
    ...
  end
  else
    Result := CallNextHookEx(SysHook, Code, WParam, LParam);
end;

procedure Hook(Flag: Boolean); export; stdcall;
begin
  if Flag then
    SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0)
  else
    begin
      UnhookWindowsHookEx(SysHook);
      SysHook:=0;
    end;
end;

exports Hook;

begin
end.



И программа которая юзает dll-ку с хуком
Код


procedure TForm1.Button1Click(Sender: TObject);
var
  Hook: MyProcType;
begin
  HDLL := LoadLibrary(PChar('MegaHook.dll'));
  if HDLL > HINSTANCE_ERROR then
  begin
    @Hook := GetProcAddress(HDLL, 'Hook');
    Hook(True);
  end
  else
    MessageDlg('плохо с DLL.', mtError, [mbIgnore], 0);
end;

procedure TForm1.Button2Click(Sender: TObject);

var
  Hook: MyProcType;
begin
  if HDLL > HINSTANCE_ERROR then
  begin
    @Hook := GetProcAddress(HDLL, 'Hook');
    Hook(False);
  end;
End;


--------------------
Мне чужого лишнего не нада.Ешь ананасы, рябчиков жуй,день твой последний приходит, буржуй...
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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