|
|
Képernyővédő alkalmazás készítése
Képernyővédő 3. rész
|
|
Példaprogram letöltése
10129 bájt
|
Tovább folytatva megkezdett képernyővédő alkalmazásunk fejlesztését, ezen a héten a jelszavas védelmet készítjük el. Ettől kezdve a képernyővédő futása csak a megadott jelszó beírása után szakítható meg. A jelszókezelést szerencsére az operációs rendszer végzi, így nekünk néhány függvényhíváson kívül nem marad más teendőnk. Persze nem árt tudni, hogy melyek ezek a nem dokumentált függvények és mi is a paraméterezésük.
Az eddig elkészült forráskódnál most ismét a project forráskódjában kell ténykednünk, így ezt nyissuk meg szerkesztésre.
Amikor a felhasználó a Képernyő tulajdonságok ablak Képernyővédő lapján a Jelszavas védelemre kattint, akkor elérhetővé válik a jelszó megadáshoz szükséges nyomógomb. Amikor ezt lenyomja a felhasználó, akkor kerül meghívásra a programunk a /A paraméterrel. Ez lesz az a pont, amikor a jelszó kezelést el kell végeznünk.
A mellékelt példában ehhez létrehozunk egy Password nevű eljárást.
…
1: begin//password
Password(StrToInt(s2));
end;
…
Hasonlóan a múlt héthez, most is második paraméterként kapjuk meg a hívó ablak azonosítóját (Handle), melyre itt is szükségünk lesz. Ezt a paramétert adjuk át a Password eljárásunknak.
A jelszó kezeléséhez a MPR.DLL rendszer állományban találunk egy PwdChangePassword nevű függvényt. Ezt a megfelelő paraméterekkel kell meghívnunk és a többi már a DLL dolga.
Mivel ez a függvény Delphi-ben nem dokumentált, így nincs deklarálva sem sehol. Ezt pótlólag megtehetjük viszont mi magunk is, valamint a függvény címét is lekérdezhetjük a GetProcAddress-el, miután a LoadLibrary-val betöltöttük a DLL-t.
A függvény első paramétereként a SCRSAVE sztringet kell megadnunk. Ebből tudja a függvény, hogy most a képernyővédő jelszavának megadása következik. Második paraméterként a hívó ablak azonosítójára lesz szükség, melyet paraméterként kaptunk, így most egyszerűen csak tovább adjuk. A következő két paraméterre jelen esetben nincs szükségünk.
procedure Password(Owner: integer);
var
h: THandle;
PwdChangePassword: function(pNetworkProvider: PChar;
hOwnerHandle: THandle; dwSpecialFlag: integer;
pChangeInfo: pointer): integer; stdcall;
begin
h:=LoadLibrary(PChar(GetSystemDir+'\MPR.DLL'));
if h<>0 then begin
PwdChangePassword:=GetProcAddress(h,'PwdChangePasswordA');
if Assigned(PwdChangePassword) then begin
PwdChangePassword('SCRSAVE', Owner, 0, nil);
end;
FreeLibrary(h);
end;
end;
A függvény hívásával megjelenik a szokásos jelszó bekérő ablak, ahol a felhasználó megadhatja a kívánt jelszót. Ennek tárolásáról, kódolásáról szintén a függvény gondoskodik, így nekünk nincs is több teendőnk vele.
Módosítani kell viszont a programunkat azon a ponton, ahol eddig egyszerűen csak befejezte a működését. Mostantól, amikor a képernyővédő alkalmazásunk fut már nem hagyható, hogy egyszerűen csak bezárja azt a felhasználó. Ellenőriznünk kell, hogy lett-e jelszó megadva. Ha igen, akkor azt be kell kérnünk a felhasználótól és ha helyesen írta be, csak akkor fejezhető be a programunk futása.
Ehhez nézzük most a Unit1.pas-ban a RequestClose nevű eljárásunkat. A programunk ezt az eljárást hívja meg, ha a felhasználótól olyan irányú kérés érkezett, hogy a képernyővédő futását be kellene fejezni. Eddig itt egyszerűen csak bezártuk a programot, most viszont a fenti feltételek teljesülése után tehetjük csak meg ezt.
Ehhez egy újabb jól elrejtett függvényhívásra lesz szükségünk. Ezt most a Jelszó Control Panel alkalmazásban találjuk. Ez az alkalmazás a password.cpl állományban kapott helyett. A benne lévő kérdéses függvény pedig a VerifyScreenSavePwd néven fut. A függvény hívása előtt azonban ellenőrizzük, hogy van-e rá szükség, vagyis lett-e megadva jelszó. Ezt megtudhatjuk a Windows regisztrációs adatbázisából. A Control Panel\Desktop kulcs alatt, ha a ScreenSaveUsePassword értéke nem nulla, akkor igen. Ebben az esetben a LoadLibrary-vel betöltjük a password.cpl-t, majd innen kiolvassuk a VerifyScreenSavePwd függvény címét és meghívjuk azt. Paraméterként csupán a programunk ablakának azonosítóját kell átadnunk. Ha a függvény igaz értékkel tért vissza, akkor a képernyővédő bezárható, a felhasználó helyesen megadta a jelszót.
procedure TForm1.RequestClose;
var
reg: TRegistry;
b: boolean;
VerifyScreenSavePwd: function(Parent: THandle): boolean; stdcall;
h: THandle;
begin
FMouseIgnore:=0;
b:=true;
reg:=TRegistry.Create;
reg.RootKey:=HKEY_CURRENT_USER;
if reg.OpenKey('Control Panel\Desktop', false) then begin
try
try
ShowCursor(true);
if reg.ReadInteger('ScreenSaveUsePassword')<>0
then begin
h:=LoadLibrary(PChar(GetSystemDir+'password.cpl'));
if h<>0 then begin
VerifyScreenSavePwd:=
GetProcAddress(h, 'VerifyScreenSavePwd');
b:=VerifyScreenSavePwd(Handle);
FreeLibrary(h);
end;
end;
finally
ShowCursor(false);
end;
except
end;
end;
reg.Free;
if b then begin
Close;
end;
end;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2000 évkönyv 547. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|