Wenn ich mich recht erinnere...
Win32-Tasturhooks funktionieren nur innerhalb des Desktop unter dem der Thread den Hook installiert hat. Da nicht-interaktive Dienste (Standard, bzw. anzuraten) in einem eigenen (nicht-interaktiven) Desktop ausgeführt werden, wird der Tastaturhook die Events aus den interaktiven Desktops (an denen der/die Benutzer angemeldet ist/sind) nicht mitbekommen. Du müßtest also einen Thread pro Workstation/Desktop-Kombination erzeugen und mit SetProcessWindowStation/SetThreadDesktop (ohne Fenster, sonst schlägt dies fehl) dorthin 'verschieben'. Aber um dies tun zu können, mußt Du wiederum die Sicherheitsbeschreibungen des jeweiligen Workstation- und/oder Desktop-Objekts manipulieren, da ein nicht-interaktiver Dienst die dazu notwendigen Rechte nicht hat...
(ich hoffe das war lang genug um Dich davon abzuhalten, dafür
Win32-Hooks zu verwenden

)