Главная > Программирование > Управление LightAlloy из собственных программ

Управление LightAlloy из собственных программ

Программа Light Alloy является весьма популярным видео/аудио плеером. Причин этому масса. Во-первых, программа немного весит (на диске занимает всего 2,8 mb), а в памяти хоть и занимает немало (около 12 mb), но в сравнении с тем же Media Player, который ест 20 mb с лишним, всё-таки оказывается в выигрыше. Во-вторых, программа имеет весьма удобный и привлекательный интерфейс, предусмотрены все необходимые опции и функции, при работе тормоза и сбои наблюдаются крайне редко. Не будем забывать и том, что LA для русских пользователей распространяется бесплатно. Все вышеперечисленные достоинства позволили LA добиться всеобщей любви у большинства пользователей.

Но данная статья посвящена не расхваливанию Light Alloy или описанию всех его многочисленных функций, а одной скрытой, но не мало важной опции - возможности управления плеером из внешних программ. Возможно, у вас когда-нибудь возникала необходимость воспроизвести видео или аудио файл в своей программе. И что вы тогда делали: возможно, в Delphi вы использовали компонент TMediaPlayer; в Visual C++, возможно, вы использовали API функции. В любом случае эти решения были не лучшими, ведь можно открыть и воспроизвести файл во внешнем плеере (Light Alloy), который имеет многочисленные возможности работы с аудио и видео. Сейчас я расскажу вам как это можно сделать. Сразу скажу, что сам я ничего не выдумал, всё описано в файле справки по данной программе (всё-таки в справку заглядывать бывает очень полезно). Всё, что описано ниже относится к LA версии 2.9, но я думаю, на других версиях также работать будет. Программить будем на Delphi. Вообще говоря будут использоваться API функции Windows, поэтому для перехода на другой язык, изменить надо совсем немного.

Управление программой осуществляется через передачу сообщений с помощью API функции SendMessage.

Функция имеет следующее описание:
LRESULT SendMessage(
HWND hWnd, // указатель на окно
UINT Msg, // сообщение
WPARAM wParam, // первый параметр сообщения
LPARAM lParam // второй параметр сообщения
);

Чтобы определить указатель hWnd на окно LA используется API функция FindWindow. Её описание:
HWND FindWindow(
LPCTSTR lpClassName, // указатель на имя класса окна
LPCTSTR lpWindowName // указатель на имя окна
);

Имя класса для LA "LightAlloyFront". Заголовок окна в программе всегда разный, поэтому его указывать не будем. Wnd:=FindWindow('LightAlloyFront',NIL);

В качестве сообщения Msg используется следующая константа Msg = WM_APP + 2504 (0x89C8). Константа WM_APP (value 0x8000) используется для определения собственных сообщений приложения. В Windows существует большое количество собственных предопределённых сообщений, и чтобы не вызвать конфликта приложение должно использовать для собственных нужд номер сообщения в пределах 0x8000… 0xBFFF.

В качестве первого параметра сообщения WParam используется одна из предопределённых в программе констант. В зависимости от значения параметра LA выполнит ту или иную функцию.

Например:
LAC_VERSION = 000;
LAC_FILE_OPEN = 050;
LAC_FILE_INFO = 051;

Второй параметр LParam не используется. Таким образом, вызов SendMessage выглядит, например, так: SendMessage(Wnd,WM_LACMD,LAC_PLAYBACK_PLAY,0);

А в целом процедура управления LA может быть например такой:
procedure LAPlay;
var
Wnd:HWND;
begin
   Wnd:=FindWindow('LightAlloyFront',NIL);
   if (Wnd<>0) then
   SendMessage(Wnd,WM_LACMD,LAC_PLAYBACK_PLAY,0);
end;

Ещё один вопрос, который может вызвать затруднение - как вызвать внешнюю программу из своей. Для этого используется API функция WinExec:
UINT WinExec(
LPCSTR lpCmdLine, // путь к программе
UINT uCmdShow // параметр отображения загружаемого окна
);

Вот так можно загрузит плеер, если его путь указан в edit1: WinExec(pchar(edit1.text+' /ADD '+loadstr),sw_shownormal). Параметр "/ADD" при запуске la позволяет добавить в плейлист произвольное количество файлов. Насамом деле есть ещё несколько функций, способных запускать внешние программы, но функция WinExec имеет наименьшее число параметров, поэтому является самой простой.

И ещё один момент. При добавлении в плелист фалов они запоминаются во временном плейлисте "La.lap", который находится в каталоге программы. При добавлении новых фалов этот плейлист не очищается, поэтому его нужно почистить вручную. Я это делаю при помощи своей процедуры ClearTemp.

procedure ClearTemp;
var lapstr:string; f:file;
begin
   lapstr:=Form1.Edit1.Text;
   lapstr[length(lapstr)]:='p';
   lapstr[length(lapstr)-1]:='a';
   lapstr[length(lapstr)-2]:='l';
   AssignFile(f,lapstr);
   {$I-}
   reset(f);
   {$I+}
   if IOResult = 0 then
   begin
      CloseFile(f);
      Rewrite(f);
      CloseFile(f);
   end;
end;

Всё остальное можно посмотреть в исходниках. Там реализован запуск LA с добавлением в плейлист определённых файлов. Также реализована интересная опция, которая позволяет скриншотить воспроизводимое видео с установленным интервалом времени. Кстати эту идею можно расширить, добавив например случайную прокрутку, тогда из видео ряда можно будет получить определённое количество случайных скриншотов.

Скачать исходники (62 kb)

Скриншот тестовой проги


© 2005 GMC gimix@yandex.ru
Талантов Сергей
Используются технологии uCoz