Как да получите текущо заглавие на песен от Winamp и AIMP
; секция '.data' данни за четене и запис
; Winamp/AIMP име на клас прозорец wcl db 'Winamp v1.x',0
buff rb 300h ; Буфер за получаване на текст от заглавието на прозореца play_now rb 300h ; Буфер за получаване на име на песен
; Кодов сегмент секция '.code' код, четим изпълним . ; Вземете манипулатор на прозорец на Winamp извикване на FindWindow,wcl,0 или eax,eax ; Прозорецът на Winamp не е намерен jz .no_winamp
; Манипулатор на прозореца на магазина mov ebx,eax
; Пуска ли нещо в момента? извикване на SendMessage,ebx,WM_USER,NULL,104 cmp eax,1 ; Winamp не е в състояние "Възпроизвеждане" jne .no_winamp .
Намерихме прозореца, знаем състоянието на плейъра, остава да получим името на песента, която се възпроизвежда в момента. Изглежда, че всичко е просто - трябва да изпратите друго съобщение, което също е описано в документацията, и да получите резултата. Но го нямаше. Съобщенията за получаване на информация за възпроизвеждания файл и заглавието на песента са достъпни само от контекста на процеса на самия Winamp, тоест могат да се използват само в добавките на Winamp. Логиката на разработчиците тук не е съвсем ясна, защото приложенията на трети страни имат достъп до информация за битрейта на текущата песен, размера на плейлиста, текущата позиция на възпроизвеждане и куп друга малко полезна информация, но няма просто име на песен.
Няма да ограждаме градини с плъгини, но ще разгледаме по-отблизо намерения прозорец, който е "Winamp 1.x". Оказва се, че по време на възпроизвеждане Winamp задава номера и името на текущата песен в заглавието си. И точно това ни трябва! Функцията GetWindowText решава всички наши проблеми.
. ; Вземете текст от заглавието на прозореца извикайте GetWindowText,ebx,buff,300h или 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
; Копиране на името на песента извикване на lstrcpy,play_now,esi
; Буферът play_now сега съдържа името на песента .
Трябва да се отбележи, че някои други медийни плейъри, като AIMP и Apollo, също създават прозорец с името на класа "Winamp 1.x" и, познахте, с абсолютно същите свойства. Така че описаният в тази статия метод за получаване на името на възпроизвежданата песен също е подходящ за тях.
В приложението има примерна програма с изходен код, която получава в реално време името на песента, която се възпроизвежда от плейъра на Winamp и е съвместима с него, както и официалната документация на интерфейса за програмиране на приложения на Winamp.