Вы можете отслеживать состояние "индикаторных" клавиш с помощью таймера с интервалом, скажем, в 100мс. Я просто считываю состояние клавиш следующим образом:
VAR KS : TKeyboardState; ... GetKeyboardState(KS); IF Odd(KS[VK_NUMLOCK]) THEN {caps lock нажат} ... VK_VK_CAPITAL ... VK_SCROLL ... VK_INSERT |