HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

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;


Cikksorozat



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!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |