Лирика: сто лет не асмил. Задача: есть окно, у которого имеется поля для ввода текста. Но там стоит счетчик на ввод. Хочу написать прогу, которая будет вставлять текст сама в это окно. План действий: * нахожу хендл окна * нахожу по нему хендл поля * юзаю что-то чтобы вставить туда текст Проблемы: * какой асм лучше юзать под винХП(юзал раньше тасм32 под 98)? * как найти хендл поля для ввода? * как зная хендл вставить текст? P.S.: не исключаю, что я размечтался и все не так просто.
спасибо вам. Поглядел в win32.hlp. Вроде пока все понятно. Но думаю во время написания появятся вопросы.
Предположим исследуемая программа пишет в окно текст с адреса 0x401000. Мы хотим поместить туда другую строку, которая в нашей программе тоже по адресу 0x401000. Какая строка из двух окажется в окне после SendMessage? IMHO без VirtualAlloc/WriteProcessMemory не обойтись.
уууу... тебе без Рихтера не обойтись... В условии задачи 2 ненужных параметра. SendMessage абсолютно побоку какие офсеты у чужой программы и тем более у твоей. SendMessage(FindWindowEx(hWnd, 0, "Edit", 0), WM_SETTEXT, 0, lpszYouText);
dr_dred Начнем с того, что оконная подсистема была натянута на NT без каких-либо заморочек с безопасностью, так что, зная хэндл окна более привелигированного приложения можно творить с ним все что душе угодно. Менять текст в том числе. Обойтись. Дело в том, что глобальная ядерная таблица окон спроецирована на АП всех процессов в режиме read-only, так что меняя что-то окну другого приложения нам не нужно вылазить за пределы своего АП.
можно, если родительское окно не имеет стиля DS_LOCALEDIT и не выделяет память для эдита в своей внутренней памяти процесса. ---- по умолчанию память для эдита выделяется в глобальной области для совместимости со старыми версиями винды, так что этот метод работает.
shoo Вы, конечно, учли, что "Applies to 16-bit applications only", и просто держите наготове 16-bit пример ?
Облом у меня. Сначала думал делаю чет не то. А на пятые сутки дошло, что окно дочернее. отсюда опять вопрос. Все ли так, как я себе представляю: 1. ищем хэндел процесса 2. берем у него хэндел окна 3. ну и дальше уже хэндел поля ввода и SendMessege если все так, просьба подсказать чем перебирать окна у процесса и чем перебирать процессы. Помню чем-то 3 года назад перебирал запущенные процессы(функция была похожа на ту, что с поиском файлов:FindFirst/NextFile) ну и поскольку уверен в отзывчивости местных жителей уже говорю "Cпасибо" ))
Сначала hSnapshot = CreateToolHelp32Snapshot (TH32CS_SNAPTHREAD, NULL) Потом Thread32First / Thread32Next (hSnapshot, &THREADENTRY32) Далее EnumThreadWindows (THREADENTRY32.dw32ThreadId, &EnumThreadWndProc, lParam) и EnumChildWindows (hWndParent, &EnumChildWndProc, lParam)
А можно еще вопрос, не совсем по теме Но на примере этой темы. Вот есть у меня МСДН полный. Англ я знаю выше среднего. Как мне выйти на EnumWindows с нуля?
Lex2029 Platform SDK Documentation --> Searh --> Look for Можно так --> Contens --> Windows API --> Overviewe of the Windows API --> Function by Category --> Window