...
...

Создаем автозапуск своими руками

Сегодня мы с вами займемся созданием своего собственного автозапуска для CD. На сегодняшний день существует множество специализированных программ для эффективного создания autorun'ов, например, ISDemo и пр., однако, при всех их очевидных плюсах есть один существенный минус — созданный таким образом автозапуск не будет уникален, ведь набор готовых шаблонов обычно не очень большой. Конечно, здесь можно поспорить, ведь во многих программах для создания автозапусков есть свои скриптовые языки, визуальное проектирование и пр. вкусности, но… Если вам хочется кого- то удивить действительно уникальной вещицей, тогда вам просто необходимо дочитать эту статью до конца. От вас потребуются лишь небольшие познания в Delphi (я использовал Delphi 7, однако все нижеперечисленное легко реализовать и на более ранних версиях) и немного терпения. Итак, кого же можно удивить? Ну, во-первых, это может быть ваш друг/подруга. Далее — ваш босс или ваша девушка, наконец. Представляете, как им будет приятно получить от вас диск!

Прежде чем приступать к работе, давайте вместе обсудим, что мы вообще хотим сделать. На полноценную оболочку наше творение, скорее всего, не потянет, однако обычной формой с Memo дело тоже не обойдется. В первую очередь, наша программа должна донести до пользователя информацию. Это может быть информация о диске, поздравления с днем рождения и т.д., поэтому необходимо предоставить вашему конечному пользователю возможность удобно ее прочитать. Далее в автозапуске должен быть About, чтобы человек, для которого создается autorun, знал имя Великого Программиста всех времен и народов (т.е. ваше:)). Также нужно предусмотреть обратную связь, т.е. чтобы пользователь смог набросать вам пару строк и впоследствии записать файл с посланиями:) к вам же на диск. Кроме того, надо еще позаботиться о музыкальном оформлении и — напоследок — о приятном графическом внешнем виде. Итак, концепцию разработали. Теперь надо определиться с используемыми компонентами. Предлагаю реализовать все вышеперечисленное на компоненте Notebook. Тогда мы сможем как угодно переключаться между его страницами, расположив в рядок одноименные кнопки. Помимо кнопок и Notebook'а, еще потребуются GroupBox (по желанию), Memo (или RichEdit на ваше усмотрение), а также Image и некоторые другие, менее важные, компоненты. Чтобы придать своему приложению современный, т.е. ХР'-шный, стиль, я использовал набор визуальных компонентов от Degisy Software ( сайт под названием Degisy Controls Component Suite. Он включает в себя 10 компонентов для придания приложению модного стиля: от GroupBox'a (DsGroupBox) до современного заголовка окна (DsFormTitle). Приложение с его использованием становится намного красивее, а возможность настройки цветовой схемы каждого компонента позволят вам создавать по-настоящему уникальные программы. Сразу хочу предупредить, что этот набор компонентов платный, и в Сети взломанную версию не разыскать. На помощь может придти только eMule со своими бездонными возможностями:). А без него вам придется терпеть наг-скрин, который будет напоминать о регистрации при каждом запуске вашей программы. Поскольку мы собрались делать красивое приложение, то предлагаю и вам использовать Degisy Controls Component Suite. Если не хотите, то вполне можно обойтись стандартными компонентами — просто это уже будет не то. Что особенно важно в процессе создания автозапуска — так это ваша способность творчески мыслить. Тогда приложение получится действительно эффектным, а его конечный пользователь никогда не скажет, что где- то это уже видел.

Итак, с компонентами разобрались — приступим непосредственно к делу. Запускаем Delphi и первым делом устанавливаем Degisy Controls Component Suite (набор распространяется на Delphi 5, 6, 7 и С++ Builder 6 в виде .dpk- и .bpk-файлов соответственно). Далее из новой вкладки Degisy Controls перемещаем на форму компоненты DsFormTitle и DsPanel. У последнего желательно включить свойство Gradient в Object Inspector'e, а также выставить Align в AlClient. Теперь отключаем у обоих компонентов BorderBevel и любуемся полученным результатом — панель и заголовок слились в одно целое. Осталось решить вопрос с цветом. По умолчанию используется фиолетовый оттенок, однако нас с вами умолчания никогда не устраивали:), поэтому предлагаю дать волю вашей фантазии — например, сделать градиентный переход от черного к желтому. Теперь перемещаем на форму Notebook из вкладки Win3.1. Он, к сожалению, прозрачность не поддерживает, поэтому с его цветом придется как-то выкручиваться. Осталось еще переместить на форму четыре SpeedButton (вкладка Additional). Не забудьте только включить для каждой кнопки свойство Flat для придания им современного вида. Вот что в итоге у меня получилось:

Далее нужно создать несколько страниц в Notebook, чтобы реализовать все наши задумки. Идем в Object Inspector и создаем четыре страницы (свойство Pages): Text, Music, Surprise и About. Все готово для дальнейшего продвижения. Коротко еще раз по концепции:
1. Text — сюда пишем послание.
2. Music — здесь управление музыкальным оформлением.
3. Surprise — здесь ваш пользователь будет писать вам.
4. About — здесь вы расскажете про себя.
Начнем со страницы Text (на всякий случай скажу, что страницы в Notebook'е переключаются свойством ActivePage). Кидаем на нее Memo (или RichEdit) и пишем в обработчике кнопки Text:

procedure TForm1.TextClick(Sender: TObject);
begin
Notebook1.ActivePage:='text';
end;

То же самое проделываем для Surprise: там мы также будем использовать Memo (или RichEdit). На странице Music у нас будет реализован небольшой плейер. Перемещаем на нее ListBox (здесь будет список музыкальных треков), TrackBar (это ползунок для громкости) и три кнопочки (для Play/Pause/Stop-функциональности). Теперь непосредственно к программированию. Начнем с Music, потому что там писать больше всего. Во-первых, проигрывать музыку можно несколькими способами. Первый, и самый примитивный — использовать TMediaPlayer. От этого способа откажемся сразу — пусть им Вася Пупкин занимается:+). Второй способ уже получше — он заключается в использования юнита MMSystem и процедуры MCISendString. Ну, и, наконец, можно программно запустить WinAmp и проигрывать треки там. Третий способ — самый надежный, поскольку музыка будет играть стопроцентно. А вот MCISendString работает не всегда, т.е. не на всех компьютерах. В общем, я опишу оба способа, а вы уж сами решите, какой вам больше нравится.

Итак, заведите глобальную переменную track типа string. В ней будет храниться имя трека из ListBox'а. На событие OnClick необходимо написать следующее:

procedure TForm1.ListBox1Click(Sender: TObject);
var
i:byte;
begin
for i:= 0 to Listbox1.Items.Count-1 do
if Listbox1.Selected[i]=true then Track:=Listbox1.Items[i];
end;
Так мы записываем в нашу переменную имя трека. Не забудьте добавить в ListBox строчки с нужными песнями (свойство Items). Кстати, все треки для простоты лучше именовать <имя файла>.mp3, чтобы избавить себя от лишних усилий, ведь тогда к переменной track будет достаточно лишь прибавить путь, чтобы получить готовый адрес файла. Теперь разберемся с ползунком громкости. Сначала через MMSystem. Потребуются две функции GetVolume и SetVolume, которые, соответственно, будут получать уровень громкости в системе и устанавливать его. Вот код этих функций:

type
TVolumeRec = record
case Integer of
0: (LongVolume: Longint);
1: (LeftVolume,RightVolume : Word);
end;

function GetVolume: Byte;
var Vol: TVolumeRec;
begin
Vol.LongVolume := 0;
waveOutGetVolume(0, @Vol.LongVolume);
GetVolume := (Vol.LeftVolume + Vol.RightVolume) shr 9;
end;

procedure SetVolume(aVolume: Byte);
var Vol: TVolumeRec;
begin
Vol.LeftVolume := aVolume shl 8;
Vol.RightVolume := Vol.LeftVolume;
waveOutSetVolume(0,Vol.LongVolume);
end;

Также необходимо дописать в юнитах модуль MMSystem. Теперь как это использовать. Во-первых, для TrackBar'а следует выставить свойства: Max=100;
Position=50;
TickStyle= tsNone; //для эстетики
Теперь на событие OnChange для TrackBar пишем:

{регулируем громкость системного микшера}
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
setvolume(255-trackbar1.Position*2);
end;

Также неплохо было бы восстанавливать громкость микшера по завершению нашей программы. Заводим глобальную переменную volume типа integer. На FormCreate пишем:

procedure TForm1.FormCreate(Sender: TObject);
begin
volume:=GetVolume;
end;

А на FormClose — вот это:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
setvolume(Volume);
end;

Осталось только научить наш автозапуск проигрывать музыку. Подразумевается, что музыкальные файлы лежат в том же каталоге, что и программа. Однако ничто не мешает вам использовать свои пути к mp3'шкам.

1. Если используется MMSystem, вот обработчики для кнопок Play, Pause и Stop:
procedure TForm1.PlayClick(Sender: TObject);
begin
if track='' then MessageBoxA(0,'Ничего не выбрано!', 'mini-player', MB_ok) else
MCISendString(PChar('play ' + track ), nil, 0, 0);
end;

procedure TForm1.PauseClick(Sender: TObject);
begin
MCISendString(PChar('pause ' + track ), nil, 0, 0);
end;

procedure TForm1.StopClick(Sender: TObject);
begin
MCISendString(PChar('stop ' + track ), nil, 0, 0);
end;

2.Если используется WinAmp, то все немного сложнее. Сначала его надо запустить. Сделать это можно так:

procedure RunWinamp (track:string);
begin
track:='"'+track+'"';
ShellExecute(0,'open','c:\program files\Winamp\winamp.exe',
Pchar(track), PChar(Getcurrentdir),SW_SHOW);
end;

Процедура RunWinamp принимает в качестве параметра имя проигрываемого файла. Обратите внимание, что сначала к переменной track прибавляют двойные кавычки (").
Соответственно, на обработчике кнопки Play пишем:
procedure TForm1.PlayClick(Sender: TObject);
begin
if track='' then MessageBoxA(0,'Ничего не выбрано!', 'mini-player', MB_ok) else
RunWinamp(track);
end;

Обработчики для кнопок Pause и Stop тогда выглядят так:

procedure TForm1.PauseClick(Sender: TObject);
var
h:hwnd;
begin
h:=findwindow('Winamp v1.x', nil); //Находим окно плейера
sendmessage(h,WM_COMMAND,40046,0);
end;

procedure TForm1.StopClick(Sender: TObject);
var
h:hwnd;
begin
h:=findwindow('Winamp v1.x', nil);//Находим окно плейера
sendmessage(h,WM_COMMAND,40047,0);
end;

Здесь WinAmp'у посылается соответствующее сообщение для паузы (40046) или остановки трека (40047). Кстати, полный список сообщений для WinAmp'а уже как-то публиковался в КГ. Вы сможете его найти в архиве газеты либо на сайте производителя ( сайт ). Собственно, с музыкальной составляющей мы закончили. Однако есть еще множество доработок, которые можно внести. Например, организовать сканирование текущей директории на предмет музыкальных файлов и автоматически заполнить ListBox их именами. Кроме того, не забудьте об оформлении! Что у меня получилось в итоге, см. на скриншоте:

Теперь поговорим о тех частях автозапуска, которые мы оставили в самом начале — страницах Text и Surprise. Во-первых, у первого Memo стоит включить свойство ReadOnly, так как совершенно не нужно, чтобы пользователь мог изменять то, что мы ему напишем. Во втором же Memo человек будет писать нам ответ, поэтому нужно позаботиться о возможности сохранения того, чего он нам написал. Итак, переходим на страницу Surprise и кидаем туда еще одну кнопку. Вот процедура-обработчик:

procedure TForm1.SendClick(Sender: TObject);
var
UserName:Pchar;
Namesize: Dword;
i:integer;
path,s:string;
f: textfile;
begin
GetMem(UserName, NameSize);
GetUserName(UserName, NameSize);
path:='C:\Documents and Settings\'+string(Username)+'\'+'Рабочий стол\letter.bin';
assignfile(f,path);
rewrite(f);
for i:=0 to Memo2.Lines.Count-1 do begin
s:=Memo2.Lines.Strings[i];
writeln(f,s);
end;
closefile(f);
end;

В переменную UserName заносится имя пользователя, а затем переменной path присваивается путь для Рабочего стола. Таким образом, наш файл с текстом (letter.bin) пользователь найдет именно там (разумеется, если у него стоит ХР!). Здесь также остается целое поле для творчества — можно, например, зашифровать полученный файл, разработать собственный алгоритм шифрования или вообще свой формат, однако объем статьи не резиновый, поэтому описывать подобные процедуры здесь не будем. Остается еще страничка с About, но здесь все еще больше зависит от ваших творческих способностей. Можно поместить туда свою фотографию, "повозить" по форме Label с вашим именем и пр. Подобные алгоритмы ждут вашей разработки:). Итак, подведем итог: я описал процесс создания наиболее простого и быстрого, но в то же время красивого автозапуска. За бортом осталось много всего, однако я надеюсь, что это "много" будет дописано вами. Ведь наша цель была — создать по-настоящему уникальный автозапуск. Так что вперед — модифицировать мой код, который вы найдете на сайте: www.forkg.nm.ru/KG.rar (не забудьте скачать Degisy Control Suite). После того, как откомпилируете финальный проект, можете сжать его с помощью какого-нибудь Exe-компрессора, например, UPX ( сайт ). Это уменьшит размер автозапуска (у меня из 450К осталось 175К). Теперь создаем файл autorun.inf вот такого содержания:

[Autorun]
open=autorun.exe
icon=autorun.exe

Не забудьте свой проект также переименовать в autorun.exe. Оба файла вместе с контентом готовы к записи на диск.

P.S. Если у вас возникнут какие-то вопросы по Delphi, обращайтесь к сайту www.delphikingdom.com. Просто отличный портал с морем информации. Кстати, чтобы задать вопрос на этом сайте, регистрация не обязательна!
P.S.S. Все замечания и предложения по исходному коду просьба присылать на мой e-mail.

Всего доброго!

Алексей Голованов, AlekseyGolovanov@mail.ru

© Компьютерная газета

полезные ссылки
Корпусные камеры видеонаблюдения