Сделай сам: Управление Winamp

Пример к статье 

В этот раз мы поговорим об управлении популярнейшим аудио-плеером, имя которому – Winamp. Благодаря своей нулевой цене, поддержке скинов и, что самое главное, плагинов, Winamp установлен на огромном количестве ПК. И этим программным шедевром Nullsoft, оказывается, можно довольно легко управлять программно. В связи с этим, большинство soft-каталогов не обходится без пары-тройки программ управления Winamp’ом. Давайте рассмотрим, что же происходит в недрах таких программ.

Winamp поддерживает большое количество сообщений, которые можно послать его окну при помощи функции
SendMessage(
HWND:hWnd, // идентификатор окна
Msg:Integer, // посылаемое сообщение
WParam:Integer, // первый параметр сообщения
LParam:Integer // второй параметр сообщения
);

Winamp поддерживает два основных типа сообщения (параметр Msg):
WM_COMMAND: служит только для подачи определённых команд Winamp’у (Play, Stop, Next, Close и т.д.);
WM_USER: используется не только для выполнения определённых действий, но и для определения различной информации (версия, текущая композиция, количество композиций и т.д.).


Winamp
В таблице1 приведены основные константы для первого параметра сообщения WM_COMMAND. Для их использования запишите процедуру:
Procedure WinampCommand(Command:Integer);
begin
//поиск окна Winamp’a
WinampHWND := findwindow(‘Winamp v1.x’,nil);
//если поиск успешен,то посылаем сообщение
if (WinampHWND <> 0) then
SendMessage(WinampHWND, WM_Сommand, Command, 0);
end;
Теперь для подачи сообщения типа WM_COMMAND нужно выбрать из таблицы понравившуюся константу и передать её в качестве параметра процедуре WinampCommand. Пример:
WinampCommand(40044); – переход к предыдущей композиции.
Winamp


В Таблице2 перечислены основные константы для сообщений WM_USER. Для их использования запишите следующую функцию:
Function WinampUser(data: Integer, id: Integer):integer;
begin
WinampHWND := findwindow(‘Winamp v1.x’, nil);
if (WinampHWND <> 0) then
result := SendMessage(WinampHWND, WM_USER, data, id)
else result := -1;
end;

Пример: WinampUser(1, 105); – возвращает длину текущей композиции в секундах.

Итак, управлять Winamp’ом мы научились, осталось только воплотить наши навыки в небольшую программу.

Winamp

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Registry,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Button8: TButton;
Button9: TButton;
Button10: TButton;
Button11: TButton;
Button12: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure Button10Click(Sender: TObject);
procedure Button11Click(Sender: TObject);
procedure Button12Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
  Form1: TForm1;
  reg: TRegistry;
  WinampHWND: HWnd;
implementation

{$R *.DFM}

function WinampUser(data: Integer; id: Integer):integer;
begin
  WinampHWND := findwindow(‘Winamp v1.x’, nil);
  if (Wina  mpHWND <> 0) then
    result := SendMessage(WinampHWND, WM_USER, data,id)
  else result := -1;
end;
procedure WinampCommand(Command: Integer);
begin
  WinampHWND := findwindow(‘Winamp v1.x’,nil);
  if (WinampHWND<>0) then
    SendMessage(WinampHWND, messages.WM_command, Command, 0);
end;
//Запуск Winamp’а
procedure StartWinamp;
var
  WinampExe: String;
begin
  reg := TRegistry.create;
  reg.RootKey := Windows.HKEY_LOCAL_MACHINE;
  reg.OpenKey(‘Software\CLASSES\Winamp.File\shell\open\command’, False);
  WinampExe := reg.ReadString(»);
  reg.Free;
  if (WinampExe<>») then
  begin
    WinampExe := copy(WinampExe, 2, length(WinampExe)-7);
    WinExec(pchar(WinampExe), SW_SHOWNORMAL);
  end;
end;
procedure Play;
begin
  WinampCommand(40045);
end;
procedure Stop;
begin
  WinampCommand(40047);
end;
procedure Pause;
begin
  WinampCommand(40046);
end;
procedure NextTrack;
begin
  WinampCommand(40048);
end;
procedure PrevTrack;
begin
  WinampCommand(40044);
end;
{передвинуть текущую позицию на 5 секунд вперёд}
Procedure FastForward5Sec;
begin
  WinampCommand(40148);
end;
{передвинуть текущую позицию на 5 секунд назад}
Procedure FastRewind5Sec;
begin
  WinampCommand(40144);
end;
//перезагрузить Winamp
Procedure RestartWinamp;
begin
  WinampUser(0, 135);
end;
Procedure CloseWinamp;
begin
  WinampCommand(40001);
end;
Procedure RepeatMode;
begin
  WinampCommand(40022);
end;
Procedure SuffleMode;
begin
  WinampCommand(40023);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  StartWinamp;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  Play;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
  Stop;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
  Pause;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
  NextTrack;
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
  PrevTrack;
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
  CloseWinamp;
end;
procedure TForm1.Button8Click(Sender: TObject);
begin
  FastForward5Sec;
end;
procedure TForm1.Button9Click(Sender: TObject);
begin
  FastRewind5Sec;
end;
procedure TForm1.Button10Click(Sender: TObject);
begin
  RestartWinamp;
end;
procedure TForm1.Button11Click(Sender: TObject);
begin
  RepeatMode;
end;

procedure TForm1.Button12Click(Sender: TObject);
begin
  SuffleMode;
end;
end.

Разумеется, это только прототип. В одной из следующих статей мы обязательно превратим программу в плагин для Winamp’а и добавим поддержку горячих клавиш. На сегодня всё.

Иван Ширко

ishyrko@gmail.com

7 Replies to “Сделай сам: Управление Winamp”

  1. Сделай сам: Визуализационный плагин к Winamp | Статьи о программировании и не только:

    […] с плеером Winamp мы научились в статье Управление Winamp. Теперь перейдем к разработке плагинов для него. […]

  2. Очень полезный блог, автор всегда (почти) описывает актальные темы. Спасибо.

  3. Увлекательно. Добавлю в закладки. А сколько времени ушло на написание статьи?

  4. Статья хорошая, но шлак один есть: не все «основные» сообщения WM_USER в той таблице :-\

  5. А у меня вопрос как вы узнаете код и описание команды и т.д. Вопрос в том каким образом узнать список команд которыми можно пользоватся с помощью сообщений для любого другого приложения??? это очень важно! зарание благодарен

  6. >>dimid для winamp’a команды брал из мануала, но для любого другого приложения можно подбирать команды простым перебором. Когда-то давно писал прогу для управления горячими клавишами любым приложением, там просто перебор использовался

Comments are closed.