Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 3. - Ovládání CD mechaniky; Uspání monitoru; Spořič obrazovky

Jan Šindelář - 8.8.2001

Ovládání CD mechaniky

Nejprve si ukážeme otevírání a zavírání "dvířek" CD mechaniky. Budeme k tomu potřebovat knihovny Mplayer a MMsystem, takže je nezapomeňte přidat k ostatním do Uses.

Napíšeme si tedy dvě funkce EjectCD a CloseCD.Obě funkce vrátí True nebo False v závislosti na tom, zda byl pokus o otevření/zavření úspěšný nebo ne.

function EjectCD: boolean;
var  mp : TMediaPlayer;
begin
mp := TMediaPlayer.Create(nil);
mp.Visible := false;
mp.Parent := Application.MainForm;
mp.Shareable := true;
mp.DeviceType := dtCDAudio;
mp.Open;
mp.notify:=true;
mp.Eject;
if mp.notify=false then result:=false
                  else result:=true;
mp.Close;
mp.free;
end;


function CloseCD:boolean;
var  mp : TMediaPlayer;
begin
  result := false;
  mp := TMediaPlayer.Create(nil);
  mp.Visible := false;
  mp.Parent := Application.MainForm;
  mp.Shareable := true;
  mp.DeviceType := dtCDAudio;
  mp.Open;
  mciSendCommand(mp.DeviceID,  MCI_SET, MCI_SET_DOOR_CLOSED, 0);
  mp.Close;
  mp.free;
  result := true;
end;

Abych byl upřímný, nejsem příliš spokojený s funkcí na zavření mechaniky. Sice funguje, to ano, avšak při zavírání dojde na chvilku k určitému "zamrznutí" systému, které trvá tak dlouho, dokud se mechanika nezinicializuje, což může trvat i 2 až 3 sekundy (záleží na modelu vaší mechaniky). Zkuste si např. spustit Přehrávač CD z Windows a zkusit zasunout CD přes tlačítko Eject. I v tomto programu (a řadě dalších) dojde k malému "mikrospánku" systému, což mě utvrzuje v tom, že tento způsob není moje chyba, nýbrž pravděpodobně vlastnost systému Windows. Na druhou stranu ale musím přiznat, že jsem viděl i software, který touto vadou netrpěl, avšak dosud se mi nepodařilo přijít na způsob jak to dokázat. Pokud někdo ví, jak na to, budu rád, když se ozvete a pochlubíte se.

Uspání monitoru

V našem dalším příkladu si ukážeme, jak "uspat" monitor neboli jak jej přepnout do úsporného režimu. Je to funkce zajímavá, ačkoliv jí asi většina z vás moc nevyužije. Chce to opravdu již závažný důvod k tomu, aby vaše aplikace uspala monitor, pokud to ovšem není její primární funkcí. Napadá mě, že by se dalo využít této funkce např. k naprogramování malého "vypínače" - tlačítka v rohu obrazovky, po jehož aktivaci by se monitor uspal .Pokud kupříkladu víte, že musíte od počítače odběhnout na více než jen pár minut, ale z nějakého důvodu nemůžete vypnout počítač (např. probíhající výpočet apod.), potom by to byla funkce celkem užitečná. Jinak by se totiž nejprve spustil spořič obrazovky a až po delší době (podle nastavení) by se deaktivoval monitor, což může být nejen zbytečné plýtvání energií, ale také zbytečné opotřebování monitoru.

Takže dost teorie, zde máme náš zdrojový kód:

procedure Uspi;
begin
SendMessage(Application.Handle,wm_SysCommand,SC_MonitorPower,0);
end;

procedure Probud;
begin
SendMessage(Application.Handle,wm_SysCommand,SC_MonitorPower,-1);
end;

Důrazně vás však musím upozornit na to, že musíte ve svém programu též ošetřit probuzení monitoru, protože pohnutí myší nebo stisk klávesy jako u běžného uspání nefunguje a vám by pravděpodobně nezbylo nic jiného, než tlačítko reset (a nebo naslepo restartovat počítač), protože monitor by se už nepodařilo probudit. Ideální a standardní je nastavit probuzení monitoru na již zmiňované pohnutí myší nebo stisk libovolné klávesy.

Milovníky Windows 2000 opět musím zklamat, že v tomto systému náš příklad nebude fungovat.

Spořič obrazovky

Na závěr jsem si nechal téma příbuzné tématu předchozímu .Spořič obrazovky jistě každý zná, takže žádné dlouhé úvody. Naučíme se jej nejen přímo spustit, ale také zakázat či povolit systému jeho spuštění, což je funkce nadmíru užitečná.

Tak tedy nejprve spuštění spořiče:

function SpustSporic : boolean;
var
  b : boolean;
begin
result := false;
if SystemParametersInfo(SPI_GETSCREENSAVEACTIVE,0,@b,0) <> true then exit;
if not b then exit;
PostMessage(GetDesktopWindow, WM_SYSCOMMAND, SC_SCREENSAVE, 0);
result := true;
end;

Funkce nejprve zjistí, zda je spořič k dispozici a pokud ano, spustí jej. V opačném případě se samozřejmě nestane nic a funkce vrátí na výstupu hodnotu false. I rychlé spuštění spořiče se může hodit jako miniaplikace (viz. předchozí příklad s vypínáním monitoru) a navíc zde odpadá i starost s opětovným programovým "probuzením" systému.

Na úplný závěr jsem si nechal deaktivaci a opětovnou aktivaci spořiče (neboli zakázání a povolení systému spořič aktivovat). K čemu je to vlastně dobré? Napadá mě hned několik využití, lépe řečeno aplikací, které tuto funkci využívají. Kupříkladu MediaPlayer nebo jiný váš oblíbený přehrávač videosouborů tuto funkci zcela jistě využívá, protože by asi nebylo moc příjemné, kdyby se vám po pár minutách filmu náhle zjevil spořič obrazovky a museli jste každých pár minut pro jistotu pohnout myší, aby se neobjevil znovu. Rovněž aplikace citlivé na zápisy na disk (např. defragmentace disku) může spořič vytrhnout z jejich činnosti (a třeba i přinutit začít od začátku), protože při jeho aktivaci se obvykle s diskem pracuje. Jistě by se našla i celá řada dalších příkladů, kdy je vhodné ho mít deaktivovaný, takže se teď naučíme, jak na to, a samozřejmě si ukážeme i způsob, jak vše uvést do původního stavu, protože ani na to byste v aplikacích neměli zapomínat.

procedure DeaktivujSetric;
begin
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,0,nil,0);
end;

procedure AktivujSetric;
begin
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,1,nil,0);
end;

Co příště?

V příštím díle nejdříve trošku potrápíme Windows tím, že se naučíme schovat Taskbar a deaktivovat tlačítko Start a dále si ukážeme pár dalších užitečných postupů, jak vylepšit vlastní aplikace.