Сейчас на форуме: hgdagon, asfa (+4 невидимых)

 eXeL@B —› Программирование —› Как вывести свой текст в чужой контрол?
Посл.ответ Сообщение

Ранг: 218.5 (наставник), 2thx
Активность: 0.090
Статус: Участник

Создано: 28 января 2007 14:32 · Поправил: 0xy
· Личное сообщение · #1

Есть окно типа About/о проге. Создается на базе соответствующего ресурса при вызове из меню, а иногда сразу после запуска проги. После закрытия окно дестроится.
Хочу вывести в это окно свой текст. Куда прицепить процедуру?

ps
Речь не о тупом редактировании ресурсов



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 28 января 2007 15:08
· Личное сообщение · #2

Очевидно найти хендел контрола и вывести текст.



Ранг: 218.5 (наставник), 2thx
Активность: 0.090
Статус: Участник

Создано: 28 января 2007 16:33
· Личное сообщение · #3

Freecod пишет:
найти хендел контрола и вывести текст

Это понятно.
Но сначала ведь нужно найти процедуру, создающую окно?



Ранг: 10.5 (новичок)
Активность: 0.010
Статус: Участник

Создано: 28 января 2007 19:00 · Поправил: rmf
· Личное сообщение · #4

0xy пишет:
Но сначала ведь нужно найти процедуру, создающую окно?

Если ты делаешь это дизассемблером, то это и есть "тупое редактирование ресурсов", только через одно место...

Freecod имел ввиду написать программу, которая будет искать окно О программе, и менять в нём текст необходимых контролов... причем постоянно искать и менять, если окно дестроится...




Ранг: 264.0 (наставник), 5thx
Активность: 0.210
Статус: Участник
Vanilla Sky

Создано: 28 января 2007 19:05
· Личное сообщение · #5

InqSoft.... как там её... Бля,.. забыл как называется.
Короч, InqSoft. =)



Ранг: 123.7 (ветеран)
Активность: 0.10
Статус: Участник
1nn0$/100

Создано: 28 января 2007 19:18
· Личное сообщение · #6

Grim Fandango, InqSoft Sign 0f Misery

-----
Blame the victim!




Ранг: 218.5 (наставник), 2thx
Активность: 0.090
Статус: Участник

Создано: 28 января 2007 19:44
· Личное сообщение · #7

rmf пишет:
написать программу, которая будет искать окно О программе, и менять в нём текст необходимых контролов... причем постоянно искать и менять

Думаю, в моем случае это лишнее, да и неудобно.
Я исхожу из того, что процедура, создающая окно, существует в единственном экземпляре, и хочу добавить в нее код, изменяющий текст.
Вопрос: как бысторо найти эту процедуру?
Вызывается она отсюда: MENUITEM "О программе...", -7872. Можно ли использовать эту цифру для поиска процедуры?

зы
А этот InqSoft--интересная штуковина



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 28 января 2007 21:20 · Поправил: Freecod
· Личное сообщение · #8

И? Процедура просто отрисует окошко из ресурсов через Win или неWin API и всё. Ты конечно можешь внедрить после этого кода свой, модифицирующий текст в контроле (хендл окна можно взять не отходя от кассы, то есть от функции), один вопрос - а нах? Любитель садомазо?
А искать надо не MENUITEM, а ставить бряки на создание окон и всё.



Ранг: 218.5 (наставник), 2thx
Активность: 0.090
Статус: Участник

Создано: 28 января 2007 22:56
· Личное сообщение · #9

Freecod пишет:
искать надо не MENUITEM, а ставить бряки на создание окон и всё

Эт ясное дело. Но я подумал, может через MenuItem быстрее получится Цифра ведь что-то означает?

Freecod пишет:
Процедура просто отрисует окошко из ресурсов через Win или неWin API и всё. Ты конечно можешь внедрить после этого кода свой, модифицирующий текст в контроле

Именно это я и собираюсь сделать

Freecod пишет:
хендл окна можно взять не отходя от кассы, то есть от функции

Пока не нашел, где его брать
Окно создает CreateDialogIndirectParam, а контролы отрисовывает ейная CallBack-функция. Видимо, в ней нужно копать?



Ранг: 52.2 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 29 января 2007 01:33
· Личное сообщение · #10

Эт ясное дело. Но я подумал, может через MenuItem быстрее получится Цифра ведь что-то означает?
Циферка используется для/при компиляции программы. При вылавливании handl'a этого контрола она будет уже совсем другой. Сам handle ищется просто:

Ищешь окно через FindWindow
Потома контрол через FindWindowEx



Ранг: 108.7 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 29 января 2007 02:14 · Поправил: Freecod
· Личное сообщение · #11

0xy пишет:
Окно создает CreateDialogIndirectParam, а контролы отрисовывает ейная CallBack-функция

Отрисовывает API, а вот если текст модифицицируется программой (самой, например пишет туда "не зарегистр." найди в DlgProc там SetWindowsText, SetDlgItemText, итп и дай ей свой текст;
А если не изменяет - сам добовляй код как хотел.

PS Одно время забавлялся с авто-модером всех MesBox в exe ^)



Ранг: 4.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 01 февраля 2007 01:09
· Личное сообщение · #12

Vitek, насчет той цифирки.... Если мне не изменяет память и логика, то это menu item ID, он потом прилетит в качестве куска wParam в DlgProc, а вторая часть wParam будет WM_COMMAND.
Вот что пишет про это МСДН:
The WM_COMMAND message is sent when the user selects a command item from a menu, when a control sends a notification message to its parent window, or when an accelerator keystroke is translated.
...
wParam
The high-order word specifies the notification code if the message is from a control. If the message is from an accelerator, this value is 1. If the message is from a menu, this value is zero.
The low-order word specifies the identifier of the menu item, control, or accelerator.
Таким образом копаясь в DlgProc можно найти нужный кус.


Таким образом обнаружив DlgProc можно поанализить ее ветвление и найти нужный кусок кода.



Ранг: 7.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 15 февраля 2007 20:21
· Личное сообщение · #13

Никакого дизассемблирования и поиска процедур делать не надо. Можно сделать так - ставишь хук через SetWindowsHookEx с параметром WH_CALLWNDPROC, и ловишь окно с нужным именем класса. Если это диалог, то имя класса будет одно и то же #32770, в этом случае смотришь заголовок окна и хэндл процесса (через GetWindowThreadProcessId). Дальше находишь нужные дескрипторы статического текста и вызываешь SetWindowText Способ хорош тем, что можно применить к любому окну любой программы без какого-либо разбирания кода.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 15 февраля 2007 21:56
· Личное сообщение · #14

Не пойму в чем трабла? Если по условию задачи мы можем лезть в бинарник программы, то не проще ли текст поменять или указатель на него, а маяться непонятно чем.
Freecod пишет:
Любитель садомазо?

+1

-----
Yann Tiersen best and do not fuck




Ранг: 60.4 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 16 февраля 2007 18:26
· Личное сообщение · #15

0xy, я думал я извращенец



Ранг: 68.8 (постоянный)
Активность: 0.120
Статус: Участник

Создано: 16 февраля 2007 22:36
· Личное сообщение · #16

0xy пишет:
Хочу вывести в это окно свой текст

0xy пишет:
Я исхожу из того, что процедура, создающая окно, существует в единственном экземпляре, и хочу добавить в нее код, изменяющий текст

Так ты хочешь всё таки добавить в окно текст или заменить его? Подходы тут могут быть имхо разные...



Ранг: 63.1 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 16 февраля 2007 23:27
· Личное сообщение · #17

InqSoft Windows Scanner 1.7 by CyberManiac, кстати классный парень.
Хэрдл твоего эбаута элементарно определяется любым оконным шпионом, ввод или замена текста производятся через обычный интерфейс оконных команд.



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 17 февраля 2007 00:28
· Личное сообщение · #18

PE_Kill пишет:
то не проще ли текст поменять или указатель на него, а маяться непонятно чем.

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




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 17 февраля 2007 04:05
· Личное сообщение · #19

Find&Replace, что может быть проще?

-----
Yann Tiersen best and do not fuck




Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 17 февраля 2007 22:37
· Личное сообщение · #20

PE_Kill пишет:
Find&Replace, что может быть проще?

Нет! Текст вроде тоже динамический. Нужен Find&Replace для инжекта команд. Думаю и что Replace для Oxy не проблема. Проблема именно Find.



Ранг: 7.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 19 февраля 2007 21:16
· Личное сообщение · #21

проблем нет никаких. как я писал выше, ставите хук на сообщения, и когда получате сообщение WM_INITDIALOG (а речь скорее всего о диалоге), то получаете текст окна (через GetWindowText), и сравниваете с нужной строкой, например TEXT("About..."). Дальше выполняете следующий код SetDlgItemText(msg->hwnd, IDC_STATIC, TEXT("привет, уже всё сделано")). ну а идентификатор контрола IDC_STATIC можно посмотреть в редакторе ресурсов. Если надо совсем универсальный код, то тогда ищете через GetNextWindow контрол, который содержит какую-то ключевую фразу, и заменяете текст на свой. Вообще смотрите мой KillProc в этом разделе, с помощью него можно заменить текст любого окнного элемента на удалённом кампе через оконный сканер.


 eXeL@B —› Программирование —› Как вывести свой текст в чужой контрол?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати