SetFocus(hWnd); устанавливает фокус окну, возвращает hWnd окна которое имело фокус последним. Еще наверное можно отслеживать сообщения WM_KILLFOCUS
GetWindow(hActiveWnd, GW_HWNDPREV); The retrieved handle identifies the window above the specified window in the Z order. Это нужно?
Надо отлавливать WM_ACTIVATE. Когда оно приходит на активацию текущего окна, там в lParam лежит hWnd предыдущего активного окна. Но обязательно проверяй, что это именно активация (младшее слово wParam должно быть WA_ACTIVE или WA_CLICKACTIVE).
Это только, если окна в рамках одного потока, а мне нужно окно другого приложения. Нет, т. к. z-порядок не обязательно соответствует порядку в котором активировались окна. Если окна из разных процессов - не сработает.
Это вопрос к разработчикам Windows. Во всяком случае, у меня не работает и судя по гуглу у остальных тоже. Но это именно о том, что предложил Dmitry_Milk: "Надо отлавливать WM_ACTIVATE. Когда оно приходит на активацию текущего окна". А это может быть и подойдёт, попробуем. Только, не будет ли проблем в Vista и 7?