Определите, какое окно было активным непосредственно перед активацией моего приложения - PullRequest
5 голосов
/ 26 января 2011

В Delphi XE я пытаюсь использовать GetForegroundWindow, чтобы обнаружить окно, которое было активным непосредственно перед активацией моего приложения. «Активировано» означает, что приложение, возможно, было восстановлено из пиктограммы, или оно было переключено на вкладку alt +, или вызвано горячей клавишей активации и т. Д.

Проблема в том, что все доступные события приложения (OnActivate, OnRestore) приходят слишком поздно, поэтому GetForegroundWindow возвращает дескриптор моей собственной формы. События главной формы еще менее полезны. Обработка WM_ACTIVATEAPP в основной форме тоже происходит слишком поздно.

Один из способов - продолжать проверять активное окно по таймеру, пока мое приложение не активно, но это кажется довольно расточительным. Гораздо лучшим решением было бы создание подкласса TApplication.WndProc и выполнение моей работы до обработки WM_ACTIVATEAPP, но я не думаю, что TApplication можно разделить на подклассы.

Есть ли лучший способ?

Ответы [ 2 ]

5 голосов
/ 26 января 2011

Когда ваше приложение активируется, оно становится самым верхним окном.Таким образом, он переходит в верхнюю позицию Z-порядка.

При этом предыдущее самое верхнее окно переводится в положение «чуть ниже нового самого верхнего окна».IOW, он становится вторым в позиции Z-порядка.

Вызов GetNextWindow и передача ему дескриптора вашей формы и GW_HWNDNEXT может дать вам именно тот результат, который вам нужен.

0 голосов
/ 26 января 2011

У всех окон есть z-порядок, который является числом, которое окна используют, чтобы определить, какое окно должно быть нарисовано поверх какого.

Когда вы активируете программу, ваше приложение помещается в верхнюю часть z-списка.

Когда вы нажимаете alt-tab, окна циклически перебирают этот список. Так что нажмите alt-tab и удерживайте его, чтобы увидеть, как вещи упорядочены.

Проверьте это, чтобы увидеть, как симулировать alt-tab: http://www.swissdelphicenter.ch/torry/showcode.php?id=2103

...