Функция, определяющая хэндл окна по дескриптору контекста устройства?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 5 июн 2009.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Есть ли такая, друзья?

    Просто-напросто некоторое приложение создаёт несколько окон, в которых рисует строки с помощью DrawTextW (), которую я благополучно перехватываю. Так вот, строки в ОДНОМ из окон мне нужно изменить. А первый параметр DrawTextW (), как мы помним, это описатель контекта устройства.

    Но соответствует ли он нужному окну? Как узнать? Существует ли функция, которая, два параметра- хэнл окна и дескриптор контекста устройства. И возвращающая, допустим 1 если десткриптор контекста устройства соответствует этому окну (проще говоря: при вызове DrawTextW с таким первым параметром в этом окне БУДЕТ нарисована строка) или 0, если не соответствует.

    Тогда я просто вставляю вызов этой функции в мой код. Если она возвращает 1- заменяю строку (второй параметр DrawText на строку, которую мне нужно нарисовать. Если возвращаю 0- ничего не делаю.)

    Пока же я перехватываю DrawTextW, заменяю указатель на массив символом другим указателем и во ВСЕХ окнах приложения прописывается другая строка.
    А нужно, чтобы в одном только окне

    Хэндл окна нахожу вручную с помощью некоторой утилиты.

    ...
    http://www.delphimaster.ru/articles/winapi/index.html
    http://www.realcoding.net/article/view/404

    Вот по этим ссылкам я ходил, там функции для раблты с окнами, да и в других местах искал тоже, но не нашёл. Спасибо, если кто поможет.
     
  2. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    HWND WindowFromDC(HDC hdc)
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Да, это та функция, спасибо.
    Ну, я сразу же спрошу- но почему она всегда возвращает 0?

    Вот, допустим, приложение рисует что-то в нескольких окнах с помощью функции TextOutW. Перехватываю её. Вместо её кода выполняется такой код

    Код (Text):
    1. push [esp+4]
    2. call WindowFromDC
    3. ;Тут, думаю, всё понятно. В стек положен hDS и вызвана WindowFromDC
    4.  
    5. mov edi, edi
    6. push ebp
    7. mov ebp, esp
    8. jmp <(адрес WindowFromDC)+ 5>
    ...Всё, перехват работает и без сбоев, кстати.
    Но WindowFromDC всегда возвращает ноль вместо хэндла одного из окон!
    А определяю я так: в OllyDbg ставлю на строку
    Код (Text):
    1. mov edi, edi
    Условный бряк. Условие "EAX" (или "EAX!= 0"). Ни разу бряк не срабатывает.
    Ну, и так тоже, нет-нет, да и поставлю простой бряк эту строчку и смотрю EAX. Он всегда нулевой.

    Cтранно, очень странно
    (Приложение для прорисовки окон использует и ещё одну функцию- DrawTextW. При её перехвате результат такой же)
    В общем, вот. Помогите, кто может.
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    amvoz
    Вполне вероятно, что функции вывода графики (включая TextOut) работают с промежуточным DC. А потом в своё время с помощью BitBlt, например, вся графика переносится на DC, ассоциированный с соответствующим окном. Поэтому WindowFromDC и возвращает нуль.
    P.S. Не jmp <(адрес WindowFromDC)+ 5>, а jmp <(адрес TextOutW)+ 5>.