eXeL@B —› Программирование —› Как вывести свой текст в чужой контрол? |
Посл.ответ | Сообщение |
|
Создано: 28 января 2007 14:32 · Поправил: 0xy · Личное сообщение · #1 |
|
Создано: 28 января 2007 15:08 · Личное сообщение · #2 |
|
Создано: 28 января 2007 16:33 · Личное сообщение · #3 |
|
Создано: 28 января 2007 19:00 · Поправил: rmf · Личное сообщение · #4 0xy пишет: Но сначала ведь нужно найти процедуру, создающую окно? Если ты делаешь это дизассемблером, то это и есть "тупое редактирование ресурсов", только через одно место... Freecod имел ввиду написать программу, которая будет искать окно О программе, и менять в нём текст необходимых контролов... причем постоянно искать и менять, если окно дестроится... |
|
Создано: 28 января 2007 19:05 · Личное сообщение · #5 |
|
Создано: 28 января 2007 19:18 · Личное сообщение · #6 |
|
Создано: 28 января 2007 19:44 · Личное сообщение · #7 rmf пишет: написать программу, которая будет искать окно О программе, и менять в нём текст необходимых контролов... причем постоянно искать и менять Думаю, в моем случае это лишнее, да и неудобно. Я исхожу из того, что процедура, создающая окно, существует в единственном экземпляре, и хочу добавить в нее код, изменяющий текст. Вопрос: как бысторо найти эту процедуру? Вызывается она отсюда: MENUITEM "О программе...", -7872. Можно ли использовать эту цифру для поиска процедуры? зы А этот InqSoft--интересная штуковина |
|
Создано: 28 января 2007 21:20 · Поправил: Freecod · Личное сообщение · #8 И? Процедура просто отрисует окошко из ресурсов через Win или неWin API и всё. Ты конечно можешь внедрить после этого кода свой, модифицирующий текст в контроле (хендл окна можно взять не отходя от кассы, то есть от функции), один вопрос - а нах? Любитель садомазо? А искать надо не MENUITEM, а ставить бряки на создание окон и всё. |
|
Создано: 28 января 2007 22:56 · Личное сообщение · #9 Freecod пишет: искать надо не MENUITEM, а ставить бряки на создание окон и всё Эт ясное дело. Но я подумал, может через MenuItem быстрее получится Цифра ведь что-то означает? Freecod пишет: Процедура просто отрисует окошко из ресурсов через Win или неWin API и всё. Ты конечно можешь внедрить после этого кода свой, модифицирующий текст в контроле Именно это я и собираюсь сделать Freecod пишет: хендл окна можно взять не отходя от кассы, то есть от функции Пока не нашел, где его брать Окно создает CreateDialogIndirectParam, а контролы отрисовывает ейная CallBack-функция. Видимо, в ней нужно копать? |
|
Создано: 29 января 2007 01:33 · Личное сообщение · #10 Эт ясное дело. Но я подумал, может через MenuItem быстрее получится Цифра ведь что-то означает? Циферка используется для/при компиляции программы. При вылавливании handl'a этого контрола она будет уже совсем другой. Сам handle ищется просто: Ищешь окно через FindWindow Потома контрол через FindWindowEx |
|
Создано: 29 января 2007 02:14 · Поправил: Freecod · Личное сообщение · #11 0xy пишет: Окно создает CreateDialogIndirectParam, а контролы отрисовывает ейная CallBack-функция Отрисовывает API, а вот если текст модифицицируется программой (самой, например пишет туда "не зарегистр." найди в DlgProc там SetWindowsText, SetDlgItemText, итп и дай ей свой текст; А если не изменяет - сам добовляй код как хотел. PS Одно время забавлялся с авто-модером всех MesBox в exe ^) |
|
Создано: 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 можно поанализить ее ветвление и найти нужный кусок кода. |
|
Создано: 15 февраля 2007 20:21 · Личное сообщение · #13 Никакого дизассемблирования и поиска процедур делать не надо. Можно сделать так - ставишь хук через SetWindowsHookEx с параметром WH_CALLWNDPROC, и ловишь окно с нужным именем класса. Если это диалог, то имя класса будет одно и то же #32770, в этом случае смотришь заголовок окна и хэндл процесса (через GetWindowThreadProcessId). Дальше находишь нужные дескрипторы статического текста и вызываешь SetWindowText Способ хорош тем, что можно применить к любому окну любой программы без какого-либо разбирания кода. |
|
Создано: 15 февраля 2007 21:56 · Личное сообщение · #14 |
|
Создано: 16 февраля 2007 18:26 · Личное сообщение · #15 |
|
Создано: 16 февраля 2007 22:36 · Личное сообщение · #16 |
|
Создано: 16 февраля 2007 23:27 · Личное сообщение · #17 |
|
Создано: 17 февраля 2007 00:28 · Личное сообщение · #18 |
|
Создано: 17 февраля 2007 04:05 · Личное сообщение · #19 |
|
Создано: 17 февраля 2007 22:37 · Личное сообщение · #20 |
|
Создано: 19 февраля 2007 21:16 · Личное сообщение · #21 проблем нет никаких. как я писал выше, ставите хук на сообщения, и когда получате сообщение WM_INITDIALOG (а речь скорее всего о диалоге), то получаете текст окна (через GetWindowText), и сравниваете с нужной строкой, например TEXT("About..."). Дальше выполняете следующий код SetDlgItemText(msg->hwnd, IDC_STATIC, TEXT("привет, уже всё сделано")). ну а идентификатор контрола IDC_STATIC можно посмотреть в редакторе ресурсов. Если надо совсем универсальный код, то тогда ищете через GetNextWindow контрол, который содержит какую-то ключевую фразу, и заменяете текст на свой. Вообще смотрите мой KillProc в этом разделе, с помощью него можно заменить текст любого окнного элемента на удалённом кампе через оконный сканер. |
eXeL@B —› Программирование —› Как вывести свой текст в чужой контрол? |