Итак, из того, как вы сформулировали вопрос, я понимаю, что вы хотите иметь обработчик событий, который вызывается всякий раз, когда фокус переключается между окнами. Вы хотите получать уведомления, а не опрашивать.
На самом деле я не думаю, что вызов GetFocus из OnIdle - это большая часть хака - конечно, это опрос, но это опрос с минимальными издержками без побочных эффектов - но если вы действительно хотите это отслеживать, Windows Hooks вероятно, ваш лучший выбор. В частности, вы можете установить ловушку CBT (WH_CBT) и прослушать уведомление HCBT_SETFOCUS.
Windows вызывает хук WH_CBT с этим кодом хука, когда Windows собирается установить фокус на любое окно. В случае специфических для потока хуков окно должно принадлежать потоку. Если функция фильтра возвращает TRUE, фокус не изменяется.
Вы также можете сделать это с помощью ловушки WH_CALLWNDPROC и прослушать сообщение WM_SETFOCUS.
В зависимости от того, используете ли вы глобальный хук или локально для приложения, вы можете отслеживать фокусировку на всех окнах системы или только на окнах, принадлежащих вашему процессу.