Программирование на Delphi и не только » Архив блога Сделай сам: Управление Winamp | Программирование на Delphi и не только

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

В этот раз мы поговорим об управлении популярнейшим аудио-плеером, имя которому – 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: используется не только для выполнения определённых действий, но и для определения различной информации (версия, текущая композиция, количество композиций и т.д.).

В таблице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); – переход к предыдущей композиции.

В Таблице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’ом мы научились, осталось только воплотить наши навыки в небольшую программу.

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 (WinampHWND0) 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