Obsługa Winampa 1 i 2 z poziomu dowolnego programu (Api)

AndRew

Obsługa Winamp'a z poziomu twojej aplikacji? Ależ to bardzo proste!

Tekst bazuje na dokumentacji napisanej przez Justin Frankel, Updates by Christophe Thibault

Przetłumaczył, poprawił i skomentował Andrzej 'AndRew' Tomicki - andrew(na)silesianet.pl


Ściągnij program demonstracyjny: winampController.zip (dead link)


Ten tekst w prosty i przystępny sposób pokaże Ci jak komunikować się z twoim ulubionym Winampem z poziomu twojej aplikacji poprzez klasyczne polecenia WinApi. Wiem, że słysząc słowo Api przechodzi Cię gęsia skórka, ale nie martw się, to nie jest takie trudne (powiedziałbym wręcz że banalne). Tak więc do dzieła!

Pobranie uchwytu

Po pierwsze, musisz uruchomić swojego winampa, mam nadzieję że wiesz jak to zrobić (jeśli nie... nie czytaj dalej). Następnie przechodzimy do kluczowej w całym tym procesie operacji - musimy znaleźć uchwyt okna winampa.

var 
    hwnd_winamp : THandle;  // w większości przypadków polecam, aby to była zmienna globalna (choć to dość nieeleganckie rozwiązanie)
 
function SzukajWinampaBoGoGdziesZgubilem : boolean;
begin
   hwnd_winamp := FindWindow('Winamp v1.x',nil);
   if hwnd_winamp=0 then begin
       showmessage('Nie znalazłem Winampa !');
       result := false;
   end else
       result := true;
end;

Pewnie zastanawiasz się dlaczego szukamy okna o nazwie Winamp v1.x ? Otóż programiści NullSoft'u tworząc Winampa 1 nie przewidzieli że powstanie Winamp 2 :). Dlatego aby zachować kompatybilność z poprzednią wersją Winamp 2 nazywa się tak jak jego poprzednik.

Dobrze, skoro już mamy uchwyt najważniejszej aplikacji w systemie, zajmijmy się wysyłaniem do niej jakichś poleceń.

Pobieranie wersji

version := SendMessage(hwnd_winamp,WM_USER,0,0);

Zmienna version przyjmie wartości :

  • 0x20yx : Winamp 2.yx
  • 0x1zyx : Winamp 1.zx (choć nie zawsze)

Czyszczenie zawartości playlisty

SendMessage(hwnd_winamp,WM_USER,0,101);

No to gramy

SendMessage(hwnd_winamp,WM_USER,0,102);

Działa prawie tak samo jak nacisnięcie "play" - z niewielkimi różnicami.. jakimi ? Otóż odtwarza pierwszą pozycję z playlisty, nie tą aktualnie zaznaczoną. </i>Info by : Pc3T</i>

Czy gramy?

res := SendMessage(hwnd_winamp,WM_USER,0,104);

res może przyjąć wartości:

  • 0 : winamp jest zatrzymany (stopped)
  • 1 : odtwarza (playing)
  • 3 : pauza

Pobieramy pozycję aktualnie odtwarzanego utworu w milisekundach

pozycja := SendMessage(hwnd_winamp,WM_USER,0,105);

Pobieramy długość aktualnie odtwarzanego utworu w sekundach

dlugosc := SendMessage(hwnd_winamp,WM_USER,1,105);

Ustawiamy pozycję odtwarzania aktualnego utworu

SendMessage(hwnd_winamp,WM_USER,ms,106);

gdzie ms jest wartością w milisekundach na którą chcemy przeskoczyć
funkcja zwraca:

  • 0 gdy operacja się powiedzie,
  • -1 gdy winamp jest zatrzymany
  • 1 przekroczymy długość utworu

Zapis aktualnej playlisty do pliku <winampdir>Winamp.m3u (wymaga Winampa 1.666+)

SendMessage(hwnd_winamp,WM_USER,0,120);

Ustawiamy zaznaczenie na playliście (Winamp 2.0+)

SendMessage(hwnd_winamp,WM_USER,numerPiosenki,121);

Zmiana głośności (Winamp 2.0+)

SendMessage(hwnd_winamp,WM_USER,volume,122);

gdzie zmienna 'volume' przymuje wartości z zakresu 0-255

Zmieniamy balans (Winamp 2.0+)

SendMessage(hwnd_winamp,WM_USER,balans,123);

gdzie 'balans' przymuje wartości z zakresu 0-255 (0 dla lewego kanału, 255 dla prawego, 127 po środku)

Ile mamy piosenek w playliście ? (Winamp 2.0+)

ilePiosenek := SendMessage(hwnd_winamp,WM_USER,0,124);

Pobieranie numeru zaznaczonego utworu w PL (Winamp 2.05+)

zaznaczony := SendMessage(hwnd_winamp,WM_USER,0,125);

Co to za utwór?! (jakość, stereo, mono i takie tam..) (Winamp 2.05+)

info := SendMessage(hwnd_winamp,WM_USER,mode,126);

gdzie info zwróci nam daną wartość w zależności od mode:

  • 0 : Samplerate (np. 44100)
  • 1 : Bitrate (np. 128)
  • 2 : Channels (np. 2)

Czy Winamp ma włączoną opcję Shuffle (Winamp 2.4+)

SendMessage(hwnd_winamp,WM_USER,0,250);

Funkcja zwróci 1 gdy shuffle jest włączone.

Czy Winamp ma włączoną opcję Repeat? (Winamp 2.4+)

SendMessage(hwnd_winamp,WM_USER,0,251);

Użycie analogiczne jak w funkcji powyżej.

Zmieniamy ustawienie Shuffle(Winamp 2.4+)

SendMessage(hwnd_winamp,WM_USER,value,252);

Pod value podstawiamy 1 gdy chcemy aby Shuffle było włączone. Jakakolwiek inna wartość wyłączy tę opcję.

Zmieniamy opcję Repeat (Winamp 2.4+)

SendMessage(hwnd_winamp,WM_USER,value,253);

Analogicznie do funkcji powyżej..

A na koniec kilka naprawdę użytecznych komend

Aby uruchomić wpisz :

SendMessage(hwnd_winamp, WM_COMMAND,command_name,0);

gdzie command_name może przyjmować wartości :

40036 - Włącza/wyłącza okno korektora graficznego
40040 - Włącza/wyłącza okno playlisty
40058 - zwiększa głośność o 1%
40059 - zmniejsza głośność o 1%
40060 - cofnij utwór o 5 sekund
40061 - przewiń utwór o 5 sekund do przodu
40044 - ⏪ - skocz do poprzedniego utworu
40045 - ► - graj
40046 - ❚❚ - pauza
40047 - ◼ - stop
40048 - ⏩ - skocz do następnego utworu
40144 - cofnij utwór o 5 sekund (hmm... czemu 2 razy to samo ?)
40145 - otwiera okienko "Open file"
40147 - zatrzymaj utwór stopniowo ściszając
40148 - przewiń utwór o 5 sekund do przodu
40154 - skocz do pierwszego utworu w liście (nawet gdy shuffle jest włączone)
40155 - wyświetla okienko "Open location"
40157 - Zatrzymaj odtwarzanie po aktualnie granym utworze
40158 - skocz do ostatniego utworu na liście
40029 - otwiera okienko "Open file"
40012 - otwiera okienko preferencji (czemu to się nie nazywa 'options' ?!)
40019 - Włącza/wyłącza zawsze_na_wierzchu
40041 - otwiera okienko "About Winamp"

19 komentarzy

"Dżizas"!! A ja się męczę i szukam jakieś cuda niewidy na jakimś kiju :D

Zakładam, że uchwyt winampa już znalazłeś.. tzn przypisałeś go do zmiennej hwnd_winamp (to najlepiej rób w onCreate formy). Teraz wrzuć na formę powiedzmy scrollBar (z własnościami : min - 0, max 255), kliknij na niego 2 razy i wklej np to :

SendMessage(hwnd_winamp,WM_USER,scrollBar.position,122);
uruchom program i ruszaj scrollem. Co się dzieje ? Właśnie przechwyciłeś suwak głośności.

[dop]
Dziś dodałem przykładowy program sterujący. Zajżyj na górę strony.

artykuł fajny, tylko niewiem oco chodzi z tą funkcją, znaczy sie znam sie troche na funkcjach (widocznie za mało) ino niewiem gdzie ją wkleić, tworzyłem nową funkcje i wklejałem tą zawartość, nie bede pisał jak jeszcze probowałem bo to niema sensu. Pokombinował bym jeszcze ale sami widzicie którą mam godzine ;) licze tylko na Twoją pomoc... tak wiem, jestem lamerem ;(

Aby pobrac aktualna piosenke to

var
  hW , hwt : HWND;
  Buffer : array[0..255] of char;
begin
  hW := FindWindow(nil, 'Winamp v1.x'); // określ uchwyt
    hWt := FindWindowEx(hW , 0, 'Winamp v1.x', nil); // określ uchwyt
  GetWindowText(hWt, Buffer, SizeOf(Buffer));
  Showmessage(Buffer);

Daje, bo szukalem i nie znalazlem... jak juz pisze to sie dziele :P

Hej, a wiecie może jak pobrać BITRATE ?

Rookie tu masz m.in. jak pobrać tytuł aktualnej mp3
http://www.planet-source-code[...]sp?txtCodeId=433&lngWId=7

funkcja getWhatsPlaying

A czy ktos moze wie, jak pobrac autora i tytul aktualnie odgrywanego kawalka? Byloby mi to bardzo pomocne... :) I jeszcze jedno - w jakim formacie (jakim typie zmiennej) odbierana jest wersja Winampa i jak to przekonwertowac na "normalny" format (np. 2.73)? :P

Mastermind:

PostMessage(Uchwyt, WM_Quit, 0, 0);

. jak tak patrze na ten mój poprzedni komentarz to zapadam sie pod ziemie, ale wtedy byłem głupi

A jaka jest funkcja wyłączania już uruchomionego winampa? Bardzo mi jest to potrzebne! Proszę o pomoc!

brawo adrew
artykulik na sześć!

Rzetelna robota.

A jak uruchomic WinAmpa z dowolnym plikem mp3 lub playlista? Po prostu uzyj ShellExecute z nazwa tego pliku. Ten artykul jest genialny.

" SendMessage(hwnd_winamp,WM_USER,0,102);

Działa prawie tak samo jak nacisnięcie "play" - z niewielkimi różnicami.. jakimi ? ja też nie wiem.. "

Ja juz wiem :) Odtwarza pierwsza pozycje z listy, nie ta ktora uzytkownik ma zaznaczona :( Jak zrobic zeby odtwarzal aktualnie wybrana piosenke?

Wspaniale! lepszegfo i praktyczniejszego artu ze świeczką po necie szukać...

Ja daje 6! Najlepszy art w histori 4programmers.net. Było pare bardzo dobrych ale ten jest najlepszy! AndRew, masz mózg Aistaina!

Dzięki chłopaki.. ale nie mnie należy się uznanie, tylko twórcom Winampa :)

Mi tez sie bardzo podoba!!! Ja przyznaje 6!!!

P.S.
Ciekawy pomysl z tym obrazkiem ;)

artykuł pierwsza klasa... brawo andrew brawo...

Super, widac ze wlozyles duzo staran w arta (obrazki, kolorowanie, skladnia)
no i sama merytoryka arta.. 6