Есть ли такая, друзья? Просто-напросто некоторое приложение создаёт несколько окон, в которых рисует строки с помощью DrawTextW (), которую я благополучно перехватываю. Так вот, строки в ОДНОМ из окон мне нужно изменить. А первый параметр DrawTextW (), как мы помним, это описатель контекта устройства. Но соответствует ли он нужному окну? Как узнать? Существует ли функция, которая, два параметра- хэнл окна и дескриптор контекста устройства. И возвращающая, допустим 1 если десткриптор контекста устройства соответствует этому окну (проще говоря: при вызове DrawTextW с таким первым параметром в этом окне БУДЕТ нарисована строка) или 0, если не соответствует. Тогда я просто вставляю вызов этой функции в мой код. Если она возвращает 1- заменяю строку (второй параметр DrawText на строку, которую мне нужно нарисовать. Если возвращаю 0- ничего не делаю.) Пока же я перехватываю DrawTextW, заменяю указатель на массив символом другим указателем и во ВСЕХ окнах приложения прописывается другая строка. А нужно, чтобы в одном только окне Хэндл окна нахожу вручную с помощью некоторой утилиты. ... http://www.delphimaster.ru/articles/winapi/index.html http://www.realcoding.net/article/view/404 Вот по этим ссылкам я ходил, там функции для раблты с окнами, да и в других местах искал тоже, но не нашёл. Спасибо, если кто поможет.
Да, это та функция, спасибо. Ну, я сразу же спрошу- но почему она всегда возвращает 0? Вот, допустим, приложение рисует что-то в нескольких окнах с помощью функции TextOutW. Перехватываю её. Вместо её кода выполняется такой код Код (Text): push [esp+4] call WindowFromDC ;Тут, думаю, всё понятно. В стек положен hDS и вызвана WindowFromDC mov edi, edi push ebp mov ebp, esp jmp <(адрес WindowFromDC)+ 5> ...Всё, перехват работает и без сбоев, кстати. Но WindowFromDC всегда возвращает ноль вместо хэндла одного из окон! А определяю я так: в OllyDbg ставлю на строку Код (Text): mov edi, edi Условный бряк. Условие "EAX" (или "EAX!= 0"). Ни разу бряк не срабатывает. Ну, и так тоже, нет-нет, да и поставлю простой бряк эту строчку и смотрю EAX. Он всегда нулевой. Cтранно, очень странно (Приложение для прорисовки окон использует и ещё одну функцию- DrawTextW. При её перехвате результат такой же) В общем, вот. Помогите, кто может.
amvoz Вполне вероятно, что функции вывода графики (включая TextOut) работают с промежуточным DC. А потом в своё время с помощью BitBlt, например, вся графика переносится на DC, ассоциированный с соответствующим окном. Поэтому WindowFromDC и возвращает нуль. P.S. Не jmp <(адрес WindowFromDC)+ 5>, а jmp <(адрес TextOutW)+ 5>.