Así que por la forma en que redactó la pregunta inferir que desea tener un controlador de eventos que se invoca cada vez que el foco cambia de una ventana a otra. Desea que lo notifiquen, en lugar de tener que sondear.
En realidad, no creo que llamar a GetFocus desde OnIdle es mucho más complicado, seguro que es un sondeo, pero es una encuesta baja sin efectos secundarios, pero si realmente quieres rastrear esto, Windows Hooks es probablemente tu mejor opción. . Específicamente, puede instalar un gancho CBT (WH_CBT) y escuchar la notificación HCBT_SETFOCUS.
Windows llama al enganche WH_CBT con este código de gancho cuando Windows está a punto de establecer el foco en cualquier ventana. En el caso de ganchos específicos de subprocesos, la ventana debe pertenecer al subproceso. Si la función de filtro devuelve TRUE, el enfoque no cambia.
También podría hacerlo con un gancho WH_CALLWNDPROC y escuchar el mensaje WM_SETFOCUS.
Dependiendo de si lo convierte en un gancho global, o local de aplicación, puede rastrear el enfoque en todas las ventanas del sistema, o solo en las ventanas que pertenecen a su proceso.
El rastreador de enfoque parece haberse movido aquí: https://github.com/Microsoft/WPF-Samples/tree/master/Accessibility/FocusTracker (Disculpas, no tengo suficiente reputación para agregar esto como comentario a la respuesta relevante anterior). – greiginsydney