2011-01-26 15 views
5

In Delphi XE, sto cercando di utilizzare GetForegroundWindow per rilevare la finestra che era attiva immediatamente prima che la mia applicazione fosse attivata. "Attivato" significa che l'app potrebbe essere stata ripristinata da uno stato iconico, oppure è stata attivata tramite alt + tab o attivata da hotkey activaton, ecc.Rileva quale finestra era attiva poco prima che la mia app si attivasse

Il problema è che tutti gli eventi dell'applicazione disponibili (OnActivate, OnRestore) arrivato troppo tardi, in modo che GetForegroundWindow restituisca l'handle del mio stesso modulo. Gli eventi della forma principale sono ancora meno utili. Anche l'elaborazione di WM_ACTIVATEAPP nella forma principale avviene troppo tardi.

Un modo sarebbe quello di continuare a controllare la finestra attiva sul timer mentre la mia applicazione non è attiva, ma questo sembra piuttosto dispendioso. Una soluzione molto migliore sarebbe quella di sottoclasse TApplication.WndProc e fare le mie cose prima che WM_ACTIVATEAPP sia elaborato, ma non penso che TApplication possa essere sottoclasse.

C'è un modo migliore?

+4

è possibile gestire qualsiasi messaggio che 'TApplication.WndProc' riceve chiamando' Application.HookMainWindow'. Le procedure di hook vengono richiamate prima che 'TApplication' esegua la propria elaborazione. Non ho idea se 'wm_ActivateApp' ti dirà in modo affidabile che tu pensi che tu debba sapere, comunque. –

risposta

5

Quando l'applicazione si attiva, diventa la finestra più in alto. IOW, salta alla posizione Z superiore.

Con questo, la finestra in alto precedente viene abbassata di livello nella posizione "appena sotto la nuova finestra più in alto". IOW, diventa il secondo nella posizione Z-order.

Chiamando GetNextWindow e passandogli l'handle del modulo e GW_HWNDNEXT potrebbe darti solo il risultato che ti serve.

0

Tutte le finestre hanno un ordine z, che è un numero utilizzato da Windows per determinare quale finestra deve essere dipinta in cima alla quale.

Quando si attiva un programma, l'applicazione viene messa in cima alla lista z.

Quando si preme alt-tab, Windows scorre in tale elenco. Quindi premi alt-tab e tienilo premuto per vedere come viene ordinata la roba.

check this out per vedere come simulare alt-tab: http://www.swissdelphicenter.ch/torry/showcode.php?id=2103

Problemi correlati