I will implement System-wide hook procedure in a DLL with Delphi XE. This is required so that the DLL (and its hook procedure) can be mapped into the address space of whatever program is triggering keystroke events. If the hook procedure were in an application not a DLL it would only be able to trap keystrokes for that application, not any others.