Programowanie w języku Delphi » Artykuły

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

  • 2016-07-13 20:14
  • 18 komentarzy
  • 1583 odsłony
  • Oceń ten tekst jako pierwszy

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"

18 komentarzy

bordeux 2008-08-27 13:07

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

malyna 2008-01-26 00:22

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

bAStek 2004-07-02 10:31

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

funkcja getWhatsPlaying

Rookie One 2004-06-21 13:50

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

Japcok 2004-03-14 17:07

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

Mastermind 2003-10-28 00:11

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

Piotr_Gil 2003-08-21 12:21

brawo adrew
artykulik na sześć!

k®is 2003-08-13 17:07

Rzetelna robota.

Beno 2003-07-02 16:41

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

Pc3T 2003-07-06 21:53

" 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?

kajoj 2003-06-21 11:43

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

tomaszos 2003-06-20 20:16

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

AndRew 2003-06-18 23:50

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

unregistred_user 2003-06-18 20:34

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

P.S.
Ciekawy pomysl z tym obrazkiem ;)

Drajwer 2003-06-18 15:30

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

AndRew 2003-06-18 00:40

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.

Japcok 2003-06-18 00:19

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 ;(

lofix 2003-07-10 02:37

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