2010-05-06 10 views
5

Ho questa applicazione Windows Form dove si trova nell'area di notifica. Se fai clic sull'icona, questo viene visualizzato in primo piano, facendo nuovamente clic (o facendo clic sull'icona X dell'app) lo rimanda. Questo è il tipo di app che ha sempre la finestra sempre in primo piano quando viene visualizzata facendo clic sull'icona (è opzionale).Bug davvero fastidioso con la proprietà TopMost in Windows Form

Facendo clic con il pulsante destro del mouse sull'icona viene visualizzato un menu di scelta rapida in cui è possibile selezionare per abilitare o meno l'opzione "sempre in primo piano". Quando l'applicazione si avvia per la prima volta, le impostazioni dell'app vengono lette da un file XML e io sono al 99% che questo funziona come dovrebbe, la proprietà TopMost viene letta correttamente (e scritta).

Dopo un po 'di tempo (minuti, ore, giorni, qualsiasi cosa, di solito si iberna e si spegne raramente) il TopMostsmette di funzionare. Non cambio l'opzione, non penso che nulla stia cambiando il valore dell'opzione, ma faccio clic sull'icona dell'area di notifica e l'app non viene visualizzata in anticipo. Si presenta ma è sullo sfondo (viene visualizzato in Alt + Tab), non è "sempre in primo piano" come dovrebbe. Espongo il menu di scelta rapida, disattivo l'opzione (perché è abilitata) e la riabilita e dopo questo inizia a funzionare. L'app è ora "sempre in primo piano". Tuttavia, può perdere questa abilità in qualsiasi momento dopo un po '.

Non riesco a capire perché questo accada e come ciò accada. Qualcuno ha qualche idea del perché? In caso negativo, qualche idea su come potrei provare a eseguire il debug di questo comportamento?

EDIT:
ho aggiunto un pezzo di codice per mostrare un MessageBox quando la proprietà TopMost è stato cambiato per vedere se ho potuto notare un comportamento strano, ma è stato inutile. Non ha aiutato perché il modulo era con TopMost = true ma era ancora in background ...

risposta

5

C'è più di una finestra "In alto". In alto dice solo "Prima di tutte le finestre non in primo piano".

Sono quasi certo che una reinizializzazione del desktop (ad esempio durante l'ibernazione) richiede un altro SetWindowPos(hwnd, HWND_TOPMOST, ...) (che è la chiamata API Win32 sottostante).

Come soluzione temporanea, è possibile ripristinare e impostare nuovamente la proprietà quando si visualizza la finestra.

Un'altra possibilità è che nascondere la finestra modifichi anche l'ordine Z - implicitamente in che modo Win32 lo implementa, o esplicitamente nel modo in cui WinForms chiama la finestra hide/show.

+0

So che la mia app non è l'unica finestra in alto, ma cose come Windows Explorer, Firefox e cose simili NON sono le più alte e la mia finestra dovrebbe essere in cima a quelle. Che non sta succedendo a causa di questo problema tecnico. Disabilito e riattivano l'opzione e le si posiziona sopra come dovrebbe. –

+0

E non penso che l'ibernazione sia il problema. Ho appena fatto un test rapido e ho ibernato la macchina con Explorer e Firefox aperti. Dopo averlo ripristinato, la mia app è ancora in primo piano.Deve succedere in una situazione diversa ... –

+0

Hai provato la soluzione che ho suggerito? (dopo aver mostrato la finestra, ripristinare e impostare la proprietà "topmost") – peterchen

1

Come peterchen anche io non ho idea di come ottenere la causa principale. Ma perché non renderlo un po 'più semplice?

Quando fai clic sull'icona, visualizzerai la finestra e contati che TopMost sia ancora attivo. Perché non chiamare lo SetWindowPos() con l'impostazione attuale proprio prima di mostrare la finestra. Questo non dovrebbe causare problemi di prestazioni (accade solo se l'utente fa clic sull'icona) né alcun altro effetto collaterale.

Lo so, sarebbe bello scoprire la causa principale, ma forse non vale la pena se è possibile risolverlo con una soluzione così piccola.

Problemi correlati