Дорабатываем DLL для LastFM

Как оказалось, библиотека для LastFM из статьи от 31.08.11 оказалась не особо юзабельной из-за нескольких досадных недоработок:
1. Клавиши управления не работали, если окно свернуто (связано с тем, что управление производилось с помощью SendMessage, но в свернутом состоянии окно не обрабатывает оконные сообщения, поэтому они переставали реагировать). (Спасибо Artik'у за наводку)
2. При сворачивании окна в трей и последующем восстановлении пропадали элементы управления, так как окно "уничтожалось".

Чтобы исправить эти моменты, я решил переписать библиотеку. В этой статье я опишу изменившиеся методы (к слову, CreateThumbnailToolbar и EnumWindowsProc остались без изменений).

Итак, начнем с глобальных переменных, которые пришлось добавить:

Теперь несколько новых функций:

Теперь о том, как я нашел процедуру обработки и определил, какие методы из неё меня интересуют. Нажимаем кнопку Play в свежеустановленном LastFM, получаем сообщение о невозможности продолжить проигрывание, открываем клиент LastFM в отладчике (я пользовался OllyDbg), ищем все строки, упомянутые в секции кода текущего модуля (Search for -> All referenced text strings), находим текст сообщения.

Переходим в функцию, которая ссылается на эту строку, ищем, откуда эта функция вызывается, и находим процедуру, в которой обрабатываются все интересующие нас события.

Остается "потыкать" на интересующие нас кнопочки и определить, какие функции вызываются при их нажатии. Адреса получились следующие:

Теперь перепишем процедуру WndProc, чтобы избавиться от проблемы №1.

Почему я использую статичные смещения для вызова функций? Во-первых, у клиента LastFM отсутствует секция релокаций, а следовательно, он будет грузиться по смещению, указанному в ImageBase.

Во-вторых, клиент довольно редко обновляется, что продлевает актуальность этой надстройки.
Наконец, остается решить проблему №2 - сделать, чтобы кнопки управления восстанавливались после закрытия и повторного открытия окна. Для этого проще всего создать таймер, который будет проверять видимость главного окна и восстанавливать кнопки управления.

И последняя измененная функция - DllMain:

Исходный код и скомпилированная DLL: скачать

Дорабатываем DLL для LastFM: 4 комментария

    1. Надо будет посмотреть в чем разница старого и нового клиента, возможно удастся для нового клиента сделать патч или DLL для бесплатного прослушивания в нём.

Добавить комментарий для 50z Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *