Вопрос

Как я могу найти адрес WndProc (окна другой процесс).Даже если я внедрю DLL и попытаюсь найти ее с помощью GetClassInfoEx(), GetWindowLong() или GetWindowLongPtr(), я всегда получаю такие значения, как 0xffff08ed, что определенно не является адресом исполняемого файла.Согласно MSDN:"...адрес оконной процедуры, или дескриптор, представляющий адрес оконной процедуры».

К сожалению, мне этого недостаточно, мне нужен реальный адрес.Spy++ большую часть времени выполняет свою работу правильно (но даже это иногда терпит неудачу).Так что это должно быть возможно.Спасибо.


[РЕДАКТИРОВАТЬ:] Престижность Крис Бекке за сверхбыстрое и правильное решение моей маленькой проблемы!

Это было полезно?

Решение

Возможно, вас загнали в тупик, потому что вы запрашиваете неправильную версию windowproc.

Оконные процессы, как и приложения, бывают двух видов:Анси и Юникод.Windows не может вернуть необработанный указатель на окно ansi приложению Unicode или наоборот, поскольку они попытаются вызвать его с неправильным типом строки.

Итак, функции GetWindowLongPtr нет.Это макрос, который разрешает две «реальные» функции, которые предоставляет API Windows:GetWindowLongPtrA и GetWindowLongPtrW.Если окно является окном Unicode и вызывается GetWindowLongPtrA, окна будут возвращать дескриптор вместо необработанного указателя, чтобы он мог перехватывать вызовы (сделанные через CallWindowProc) и маршалировать строку из ansi в unicode.Противоположное преобразование имеет иной смысл.

Даже если вы вызовете правильную функцию, вы все равно можете получить обратно дескриптор - вполне возможно, что код ansi создал подкласс окна Unicode.поэтому windowproc был полностью заменен одним из дескрипторов callWindowProc.

В таком случае - думаю, не повезло.

Другие советы

Чтобы расширить ответ Криса Бека (который решил мою проблему, спасибо!):

Итак, функции GetWindowLongPtr нет.Это макрос, который разрешает две «реальные» функции, которые предоставляет API Windows:GetWindowLongPtrA и GetWindowLongPtrW.Если окно является окном Unicode и вызывается GetWindowLongPtrA, окна будут возвращать дескриптор вместо необработанного указателя, чтобы он мог перехватывать вызовы (сделанные через CallWindowProc) и маршалировать строку из ansi в unicode.Противоположное преобразование имеет иной смысл.

Вы можете проверить, является ли рассматриваемое окно окном Unicode или ANSI, вызвав метод IsWindowUnicode функция.Используя эту информацию, вы сможете определить, какой GetWindowLongPtr функцию необходимо вызвать (во время выполнения),

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top