Як отримати назву поточного треку з Winamp та AIMP

; Сегмент даних section '.data' data readable writeable

; Назва класу вікна Winamp/AIMP wcl db 'Winamp v1.x',0

buff rb 300h; Буфер для отримання тексту із заголовка вікна play_now rb 300h ; Буфер для назви треку

; Сегмент коду section '.code' code readable executable . ; Отримати хендл вікна Winamp invoke FindWindow,wcl,0 or eax,eax ; Вікно Winamp не знайдено jz .no_winamp

; Зберегти вікно хендл mov ebx,eax

; Щось зараз відтворюється? invoke SendMessage,ebx,WM_USER,NULL,104 cmp eax,1 ; Winamp не може "Play" jne .no_winamp .

Вікно ми знайшли, стан програвача знаємо, залишилося одержати назву треку, який зараз відтворюється. Здавалося б все просто - треба надіслати ще одне повідомлення, яке також описано в документації, та отримати результат. Але не тут було. Повідомлення для отримання інформації про файл, що відтворюється, і назві треку доступні тільки з контексту процесу самого Winamp, тобто можуть використовуватися тільки в плагінах Winamp. Логіка розробників тут не зовсім ясна, адже для сторонніх додатків доступна інформація про бітрейт поточного треку, розмір плей-листа, поточну позицію відтворення і ще купу іншої малокорисної інформації, а найпростішої назви треку немає.

Городити городи з плагінами ми не будемо, а уважніше придивимося до знайденого вікна, яке "Winamp 1.x". Виявляється, Winamp при відтворенні встановлює в його заголовок номер та назву поточного треку. А саме це нам треба! Функція GetWindowText вирішує всі проблеми.

. ; Отримати текст із заголовка вікна invoke GetWindowText,ebx,buff,300h or eax,eax ; Незрозуміла помилка - текст порожній jz.no_winamp .

. ; Видалити з рядка ' - Winamp' mov esi,buff cmp dword [esi+eax-9],' - W' jne @f mov byte [esi+eax-9], 0

; Видалити з рядка номер треку @@: lodsb cmp al,' ' jne @b

; Копіювати назву треку invoke lstrcpy,play_now,esi

; Тепер буфер play_now містить назву треку .

Примітно, деякі інші мультимедійні плеєри, наприклад, AIMP і Apollo також створюють вікно з ім'ям класу "Winamp 1.x", і, як ви здогадалися, з повністю аналогічними властивостями. Так що описаний у цій статті метод отримання назви треку, що відтворюється, підходить і для них.

У прикладі приклад програми з вихідним текстом, що отримує в режимі реального часу назву відтворюваного треку з плеєра Winamp і сумісних з ним, а також офіційна документація Winamp Application Programming Interface.