Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.

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


 




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


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

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