Здравствуйте, у меня следующая задача- нужно подменить класс окна. Окно создаётся вызовом CreateWindowExA, я её перехватываю и хочу там указать свой класс(точная копия, но с другим именем)- проблема в том, что до этого в программе этот класс не регистрируется функциями RegisterClassEx(A/W) и системным тоже не является GetClassInfoEx(NULL, ...) возвращает ошибку. Может есть ещё какие-то функции для регистрации класса окна?
Может быть Вам надо не новый класс регистрировать, а выполнить subclass окна - функция SetWindowLong.
GetClassInfoEx() заполняет WNDCALSSEX параметрами существующего класса. Меняем имя класса в структуре и адрес процедуры окна и вызываем RegisterClassEx().
А что передать первым параметром? Кстати, а есть в природе книги с подробным описанием оконной подсистемы windows?
На английском - здесь: http://msdn.microsoft.com/en-us/library/ms633579(v=vs.85).aspx На русском - можно попробовать здесь: http://www.rsdn.ru/Default.aspx Слева есть ссылка - Поиск. Ищите GetClassInfoEx - там есть несколько сообщений. Первым параметром идёт HINSTANCE модуля, который создал окно искомого класса.
Это понятно, я всё в первом сообщении написал- неизвестно какой модуль создал класс, функция RegisterClassEx(A|W) не вызывалась.
Исходного кода, как я понимаю, нет? А точки останова ставились на все проявления регистрации? Код (Text): RegisterClassA RegisterClassW RegisterClassExA RegisterClassExW Занятно... наверное есть способы регистрации минуя АПИ. Если известно имя класса (из вызова CreateWindowEx), наверное можно поискать где ещё это имя используется и выйти на код регистрации? Ещё надо проверить меняется ли имя класса при каждом запуске программы - иногда имя класса делают из случайного набора символов. Кстати, отладчик обычно имеет список загруженных модулей. Посмотрите на список при остановке на CreateWindowEx. Сделайте цикл в котором вызывается GetClassInfo - и в отладчике меняйте HINSTANCE на те которые из списка модулей. Или ещё вариант: CreateWindowEx возвратит HWND - ставим точку останова на DispatchMessage по условию: HWND совпадает с тем который вернулся из CreateWindowEx. Где-то внутри должен быть вызов процедуры окна.
Ну в общем так и поступил, поймал момент, когда в памяти появился нужный текст и следил за ним. Всё просто оказалось(как обычно )- класс регистрировался через функцию по адресу 0x7549E26B, которой пользуются RegisterClassA и RegisterClassExA, причём почти без модификации передаваемых структур . Потом проверю на других ОС, может адреса не статичны(я проверял на win7, SP1).