В зависимости от того, насколько точно вы нужны вашей системы обнаружения изменения фокуса, чтобы быть вы могли бы уйти с сервисом, что опросы для переднего плана окна с помощью функции API вы описали GetForegroundWindow (да это является общесистемной, а не специфичной для процесса).
Затем вы можете использовать дескриптор этой функции, чтобы определить, какой процесс является текущим активным/сфокусированным процессом. Затем получить сфокусированный элемент (дочернее окно) этот процесс ..
HWND hwnd = GetForegroundWindow();
DWORD remoteThreadId = GetWindowThreadProcessId(hwnd, NULL);
DWORD currentThreadId = GetCurrentThreadId();
AttachThreadInput(rThreadId, curThreadId, TRUE);
HWND focusElement = GetFocus();
AttachThreadInput(rThreadId, curThreadId, FALSE);
Продолжай делать это .. и делать то, что вам нужно сделать с focusElement
UPDATE
Ну, по-видимому, как @Kenneth K., размещенное в комментарии, есть глобальное событие, которое можно подключить, чтобы приложение было уведомлено при изменении окна с фокусом (сфокусированным). Таким образом, вам не нужно постоянно зацикливаться на этих изменениях.
EVENT_SYSTEM_FOREGROUND = 3;
WINEVENT_OUTOFCONTEXT = 0;
Вы можете следить за example in this answer, чтобы увидеть, как подключить это событие и получить уведомление. Затем всякий раз, когда меняется окно переднего плана (сфокусировано), вы можете перехватывать контур сообщения этого окна и просматривать изменения фокуса формы с помощью этого окна с помощью функции SetWindowsHookEx.
Другие варианты, чтобы проконсультироваться с list of system events on MSDN и посмотреть, если есть один вы можете использовать вместо EVENT_SYSTEM_FOREGROUND, или вместе с ним, чтобы обнаружить фокус событий контроля уровня. Возможно, полезно использовать EVENT_OBJECT_FOCUS.
Пожалуйста, дайте мне знать, если это до сих пор неясно ..
Вы имеете в виду что-то вроде этого [Detect активное окно изменено с помощью C# без опроса] (http://stackoverflow.com/a/10280800/884561) ? –