Friday, December 30, 2005

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;

Wednesday, December 28, 2005

tag

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;

Tuesday, December 27, 2005

Co bude příště ?

V příštím díle našeho seriálu si ukážeme, jak ovládat CD mechaniku, pohrajeme si s monitorem a naučíme se aktivovat šetřič obrazovky.Tipy a triky v Delphi, díl 3.8. 8. 2001, Jan Šindelář formát pro tiskDnes se podíváme trošku na hardware počítače. Naučíme se otevírat a zavírat mechaniku CD. Poté si zkusíme uspat monitor a na závěr si kážeme, jak spustit spořič obrazovky.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.

Saturday, December 24, 2005

Využití

ponechávám opět na vaší fantazii. Můžete si třeba takto vytvořit zjednodušenou ochranu svých shareware aplikací (zdravíme Microsoft a Windows XP). :)
Stejně jako předchozí příklad ani tento vám bohužel nebude fungovat pod Windows 2000.
function BIOS(var jmeno,copyright,datum,serial:string):boolean;
begin
try
jmeno:= String(Pchar(Ptr($FE061)));
copyright := String(Pchar(Ptr($FE091)));
datum := String(Pchar(Ptr($FFFF5)));
serial := String(Pchar(Ptr($FEC71)));
Result:=true;
except
jmeno:='Nezjištěno';
copyright:='Nezjištěno';
datum :='Nezjištěno';
serial :='Nezjištěno';
Result:=false;
end;
end;

Wednesday, December 21, 2005

Nepříjemná zpráva

zní, že tento postup bohužel nefunguje pod Windows 2000 (a tím pádem pravděpodobně i pod Windows NT), i když to se dalo asi očekávat. Zjištění základních informací o BIOSu
Naučíme se zjistit pár základních dat, jako je jméno BIOSu, copyright (výrobce), datum a výrobní číslo. Samozřejmě nelze zaručit naprostou univerzálnost a funkčnost na všech deskách a typech BIOSů (příklad byl testován na čipsetu i440BX s Award BIOSem), ale pokud není vaše deska příliš exotická, fungovat by to mělo.

Tuesday, December 20, 2005

Nejprve přidáme

do našeho zdrojového kódu deklaraci externí funkce RegisterServiceProcess.
function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external 'KERNEL32.DLL';
A nyní již samotné schování a opětovné odkrytí naší aplikace:
procedure Schovej;
begin
RegisterServiceProcess(GetCurrentProcessID, 1);
end;

procedure Ukaz;
begin
RegisterServiceProcess(GetCurrentProcessID, 0);
end;

Monday, December 19, 2005

Schování

aplikace ze seznamu běžících procesů (po stisku CTRL-ALT-DELETE)
Využití této funkce ponechám čistě na vaší fantazii. Z hlediska určité "průhlednosti" systému by měla být správně každá aplikace po stisku CTRL-ALT-DEL vidět na seznamu běžících procesů např. kvůli potřebě "násilného" ukončení. O praktické funkčnosti tohoto ukončování ve Windows 9x se radši příliš bavit nebudeme, někdy to prostě jde a jindy zase ne. Jsou ovšem i druhy aplikací, kde by jejich násilné ukončení (ať už neznalým nebo naopak až příliš znalým uživatelem) nemuselo být právě dobré (různé "bezpečnostní" systémy, antiviry apod.), a proto je lepší, když vidět nejsou. Proto si teď ukážeme, jak na to. Ve všem nám pomůže jedna z funkcí systémové knihovny Kernel32.dll.

Friday, December 16, 2005

Nakonec

se seznámíme ještě s jednou větví registrů. Pokud nahradíme Run za RunOnce :
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
případně
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
dosáhneme toho, že program bude spuštěn pouze jednou a poté se záznam z registrů sám odstraní, takže při příštím restartu se již nespustí. Toho často využívají například instalační programy k "úklidu" těch částí aplikací, které byly během odinstalačního procesu aktivní a nemohly být smazány, či naopak k dokončení instalace po restartu počítače.

Thursday, December 15, 2005

uses Registry;

.
.

procedure OdstranZaznamZRegistru;
var key: string;
Reg: TRegIniFile;
begin
key:='\Software\Microsoft\Windows\CurrentVersion\Run';
Reg:=TRegIniFile.Create;
try
Reg.RootKey:=HKey_Local_Machine;
if Reg.OpenKey(Key,False) then Reg.DeleteValue('Kalkulacka');
finally
Reg.Free;
end;
end;
Obě tyto funkce berte samozřejmě jako pouhý zjednodušený příklad. Vylepšit je a doplnit např. o parametry (výběr větve registru, soubor, případně kontrola bezchybného zápisu), aby byly univerzálnější, jistě zvládnete již sami.

Wednesday, December 14, 2005

Snadno

můžete proceduru upravit změnou klíče na HKEY_CURRENT_USER a samozřejmě změnit též spouštěnou aplikaci.
Důležité je ovšem nejen umět záznam do registru přidat, ale musíme též vědět, jak záznam odstranit, a vždy po sobě registr při případné odinstalaci aplikace „vyčistit“ (škoda, že se tím svědomitě neřídí také profesionální odinstalátory a registry zůstávají přeplněny zbytečným a nepotřebným „balastem“). K odstranění záznamu slouží následující procedura:

(pro všechny uživatele).

Samotný záznam se skládá ze dvou částí – názvu a hodnoty. Název si můžete zvolit zcela libovolný, hodnota je textový řetězec, který obsahuje cestu ke spouštěné aplikaci včetně případných parametrů.
Nyní si tedy napíšeme jednoduchou proceduru, která nám zajistí spuštění Kalkulačky po startu Windows:
.
.
uses Registry;
.
.

procedure PridejZaznamDoRegistru;
var key: string;
Reg: TRegIniFile;
begin
key:='\Software\Microsoft\Windows\CurrentVersion\Run';
Reg:=TRegIniFile.Create;
try
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Reg.CreateKey(Key);
if Reg.OpenKey(Key,False) then Reg.WriteString(key,'Kalkulacka','c:\Windows\Calc.exe');
finally
Reg.Free;
end;
end;

Monday, December 12, 2005

Nejprve

je nutné se rozhodnout, zda budeme chtít aplikaci spouštět vždy se startem systému (tzn. pro všechny uživatele), a nebo pouze pro toho uživatele, který je aktuálně přihlášen. Zdrojový kód procedury bude pro obě možnosti totožný, lišit se bude pouze větev registrů, kde se záznam provede.
Konkrétně se tedy jedná o větve:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
(pro aktuálního uživatele)
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

Automatické spuštění aplikace

V dnešním dílu si ukážeme, jak spustit aplikaci automaticky po startu Windows, jak ji zneviditelnit v seznamu běžících aplikací po stisku kombinace kláves CTRL-ALT-DELETE, a také si ukážeme, jak zjistit několik základních informací o BIOSu počítače.

Určitě víte, že v menu Start se nachází složka "Po spuštění".Cokoliv sem umístíte (aplikaci či dokument), bude po startu systému spuštěno. Je to pro uživatele jistě rychlá a pohodlná cesta, jak svůj systém přizpůsobit svým požadavkům. Avšak z hlediska programátora není tento způsob příliš elegantní a profesionální, neboť méně zkušený uživatel může snadno tyto položky z menu Start omylem smazat. Představte si pak situaci, že by se tímto způsobem spouštěl kupříkladu rezidentní štít antivirového programu. V tom případě by se stal počítač nechráněným a nezkušený uživatel by to ani nemusel vědět. Jaké je tedy řešení? Jak jinak, pomůže nám registr Windows.

Friday, December 09, 2005

Pro úplnost

přehled (překlad) výše zmíněných priorit, použitých v naší proceduře:
• 1: Idle - Žádná (nízká), nečinné procesy
• 2: Normal - Normální, tu by měla dostat při spuštění každá běžná aplikace
• 3: High - Vysoká
• 4: RealTime - Reálný čas
Zvláště s posledními dvěma variantami je nutno nakládat opatrně, aby aplikace nezpůsobila nestabilitu celého systému.
Tímto končí první díl našeho seriálu.Vidíte, že mnohé funkce, kterými se chlubí některé (mnohdy i placené) komponenty, můžete snadno zvládnout sami, často pouhým jedním řádkem kódu.

Wednesday, December 07, 2005

procedure NastavPrioritu(p:byte);

begin
case p of
1:Setpriorityclass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);
2:Setpriorityclass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
3:Setpriorityclass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
4:Setpriorityclass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
end;
end;

Tuesday, December 06, 2005

Bohužel

tento postup nebude spolehlivě fungovat pod Windows 2000, kde se sice podaří ikonku rozsvítit či zhasnout, avšak blikání touto procedurou nedosáhnete (je to způsobeno procedurou Sleep). Za domácí úkol si zkuste tento problém vyřešit sami. V některém z příštích dílů si ukážeme jednu z možností.
Priorita aplikace
Někdy se nám může hodit i nastavení priority aplikace, tj. kolik výkonu jí systém přidělí. Pravda, na platformě Windows 9x je tato funkce malinko degradována samotnou architekturou systému, ale pod systémy Windows 2000 je plně funkční. Uvedeme si zde jednoduchou proceduru s jedním parametrem, určujícím požadovanou prioritu.

Bohužel

tento postup nebude spolehlivě fungovat pod Windows 2000, kde se sice podaří ikonku rozsvítit či zhasnout, avšak blikání touto procedurou nedosáhnete (je to způsobeno procedurou Sleep). Za domácí úkol si zkuste tento problém vyřešit sami. V některém z příštích dílů si ukážeme jednu z možností.
Priorita aplikace
Někdy se nám může hodit i nastavení priority aplikace, tj. kolik výkonu jí systém přidělí. Pravda, na platformě Windows 9x je tato funkce malinko degradována samotnou architekturou systému, ale pod systémy Windows 2000 je plně funkční. Uvedeme si zde jednoduchou proceduru s jedním parametrem, určujícím požadovanou prioritu.

Sunday, December 04, 2005

procedure Blikni;

begin
flashwindow(application.handle,true);
sleep(500);
flashwindow(application.handle,false);
end;
Tím dosáhneme jednoho bliknutí. Pokud tuto proceduru zařadíte do nějakého vhodného cyklu a patřičným způsobem nastavíte události hlavního formuláře, snadno docílíte např. toho, že aplikace bude blikat tak dlouho, dokud si toho uživatel nevšimne a maximalizuje ji.

Thursday, December 01, 2005

flashwindow(application.handle,true);

Druhý parametr určuje, zda se má ikona rozsvítit či zhasnout (false). Ke zhasnutí můžete také znovu použít příkaz s parametrem true, doporučuji však používat vždy postup s kombinací "true/false".
Nutno poznamenat, že tímto příkazem samozřejmě docílíme "rozsvícení" ikony, ale ne slibovaného bliknutí. K tomu nám pomůže ještě jeden příkaz – sleep, který nám na daný počet milisekund pozastaví běh procesu (zjednodušeně řečeno).Výsledný kód procedury pro bliknutí bude tedy vypadat např. takto: