Détecter quelle fenêtre était active juste avant l’activation de mon application

Dans Delphi XE, j’essaie d’utiliser GetForegroundWindow pour détecter la fenêtre qui était active immédiatement avant l’activation de mon application. “Activé” signifie que l’application a peut-être été restaurée à partir de l’état iconique, ou qu’elle a été basculée via alt + tab, ou a été activée par le raccourci clavier, etc.

Le problème est que tous les événements d’application disponibles (OnActivate, OnRestore) arrivent trop tard, de sorte que GetForegroundWindow renvoie le descripteur de mon propre formulaire. Les événements de la forme principale sont encore moins utiles. Le traitement de WM_ACTIVATEAPP sous la forme principale se produit trop tard.

Un moyen serait de continuer à vérifier la fenêtre active sur le minuteur pendant que mon application n’est pas active, mais cela semble plutôt inutile. Une solution bien meilleure serait de sous-classer TApplication.WndProc et de faire mon travail avant que WM_ACTIVATEAPP ne soit traité, mais je ne pense pas que TApplication puisse être sous-classé.

Y a-t-il une meilleure façon?

Lorsque votre application est activée, elle devient la fenêtre la plus haute. IOW, il passe à la position Z-order supérieure.

Avec ceci, la fenêtre la plus haute précédente est rétrogradée à la position “juste en dessous de la nouvelle fenêtre la plus haute”. IOW, il devient deuxième dans la position d’ordre Z.

En appelant GetNextWindow et en lui transmettant le descripteur de votre formulaire et GW_HWNDNEXT, vous pouvez obtenir le résultat dont vous avez besoin.

Toutes les fenêtres ont un ordre z, qui est un nombre que Windows utilise pour déterminer quelle fenêtre doit être peinte par-dessus.

Lorsque vous activez un programme, votre application est placée en tête de la liste.

Lorsque vous appuyez sur Alt-Tab, Windows parcourt cette liste. Appuyez donc sur Alt-Tab et maintenez-le enfoncé pour voir comment les choses sont ordonnées.

Découvrez ceci pour voir comment simuler un alt-tab: http://www.swissdelphicenter.ch/torry/showcode.php?id=2103