Класс окна

Тема в разделе "WASM.WIN32", создана пользователем Euler, 4 дек 2011.

  1. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    Здравствуйте, у меня следующая задача- нужно подменить класс окна. Окно создаётся вызовом CreateWindowExA, я её перехватываю и хочу там указать свой класс(точная копия, но с другим именем)- проблема в том, что до этого в программе этот класс не регистрируется функциями RegisterClassEx(A/W) и системным тоже не является GetClassInfoEx(NULL, ...) возвращает ошибку. Может есть ещё какие-то функции для регистрации класса окна?
     
  2. MikDay

    MikDay New Member

    Публикаций:
    0
    Регистрация:
    5 май 2005
    Сообщения:
    32
    Адрес:
    Minsk
    Может быть Вам надо не новый класс регистрировать, а выполнить subclass окна - функция SetWindowLong.
     
  3. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    Нет, нужно сменить название класса- по сути суперклассинг.
     
  4. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    GetClassInfoEx() заполняет WNDCALSSEX параметрами существующего класса.
    Меняем имя класса в структуре и адрес процедуры окна и вызываем RegisterClassEx().
     
  5. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    А что передать первым параметром?
    Кстати, а есть в природе книги с подробным описанием оконной подсистемы windows?
     
  6. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    На английском - здесь:
    http://msdn.microsoft.com/en-us/library/ms633579(v=vs.85).aspx

    На русском - можно попробовать здесь:
    http://www.rsdn.ru/Default.aspx

    Слева есть ссылка - Поиск.
    Ищите GetClassInfoEx - там есть несколько сообщений.

    Первым параметром идёт HINSTANCE модуля, который создал окно искомого класса.
     
  7. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    Это понятно, я всё в первом сообщении написал- неизвестно какой модуль создал класс, функция RegisterClassEx(A|W) не вызывалась.
     
  8. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Исходного кода, как я понимаю, нет?
    А точки останова ставились на все проявления регистрации?
    Код (Text):
    1. RegisterClassA
    2. RegisterClassW
    3. RegisterClassExA
    4. RegisterClassExW
    Занятно... наверное есть способы регистрации минуя АПИ.

    Если известно имя класса (из вызова CreateWindowEx), наверное можно поискать где ещё это имя используется и выйти на код регистрации?

    Ещё надо проверить меняется ли имя класса при каждом запуске программы - иногда имя класса делают из случайного набора символов.

    Кстати, отладчик обычно имеет список загруженных модулей. Посмотрите на список при остановке на CreateWindowEx.
    Сделайте цикл в котором вызывается GetClassInfo - и в отладчике меняйте HINSTANCE на те которые из списка модулей.

    Или ещё вариант: CreateWindowEx возвратит HWND - ставим точку останова на DispatchMessage по условию: HWND совпадает с тем который вернулся из CreateWindowEx. Где-то внутри должен быть вызов процедуры окна.
     
  9. Euler

    Euler New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2009
    Сообщения:
    56
    Ну в общем так и поступил, поймал момент, когда в памяти появился нужный текст и следил за ним.
    Всё просто оказалось(как обычно :))- класс регистрировался через функцию по адресу 0x7549E26B, которой пользуются RegisterClassA и RegisterClassExA, причём почти без модификации передаваемых структур :). Потом проверю на других ОС, может адреса не статичны(я проверял на win7, SP1).