import java.awt.event.*; // for KeyListener, KeyEvent import java.util.*; // for Date import java.io.*; // for PrintStream import utilities.beans.*; public class KeyLogger extends VisibleCanvas implements KeyListener { protected PrintStream log; // the log to record events in protected int maxInterKeyWait; // event compression time window protected long lastKeyTime; //------------------------------------------------------------------- // KeyLogger Constructors //------------------------------------------------------------------- public KeyLogger() { // default log stream is STDOUT, default inter-key wait: 1 sec this(System.out, 1000); } public KeyLogger(PrintStream logStream, int maxInterKeyWait) { this.log = logStream; this.maxInterKeyWait = maxInterKeyWait; this.lastKeyTime = 0; // guarantee 1st key with full t-stamp } //------------------------------------------------------------------- // Implemented KeyListener methods //------------------------------------------------------------------- public void keyTyped(KeyEvent keyEvent) { log("Key typed", keyEvent); } public void keyPressed(KeyEvent keyEvent) { log("Key pressed", keyEvent); } public void keyReleased(KeyEvent keyEvent) { log("Key released", keyEvent); } //------------------------------------------------------------------- // Log a date/time-stamped key event. // Compress key events arriving within N milliseconds of each other // into words or sentences with a single timestamp //------------------------------------------------------------------- protected void log(String entry, KeyEvent keyEvent) { long now = System.currentTimeMillis(); char key = keyEvent.getKeyChar(); if ( now - lastKeyTime > maxInterKeyWait ) { log.print("\n" + entry + " on " + new Date() +": "); log.print(key); } else { log.print(key); } log.flush(); // start new interKeyWait "timer" lastKeyTime = now; } } // End of Bean KeyLogger