2009-03-18 5 views
7

Quando la nostra app viene avviata in modo programmatico (tramite l'azione personalizzata nel programma di installazione MSI o quando si avvia una nuova istanza) in Windows Vista (anche in Windows 7 Beta) non apparirà nella barra delle applicazioni e non sarà focalizzata. L'operazione di tabulazione ad alta voce lo farà apparire correttamente nella barra delle applicazioni e resterà lì.Che cosa fa sì che una finestra non appaia nella barra delle applicazioni fino a quando non è Alt-Tabbed in Vista?

Quali sono le cause? L'ho già visto in altre app, ma non sono sicuro del perché. L'app è l'app .NET WinForms. Mai vedere questo accade in XP, solo Vista e 7

Modifica: Beh, sembra che l'unica volta che questo accade riproducibile è quando viene eseguito dall'installer, credo che ci siano altre volte in cui si verifica, ma potrei semplicemente essere pazzo . Il codice di lancio è un po 'complesso da pubblicare perché gestiamo vari parametri di lancio della riga di comando e avvia un modulo di accesso prima di avviare l'app principale, ecc.

Qualcuno ha avuto a che fare con questo scenario prima e ha funzionato?

+0

Come si avvia l'applicazione? Un esempio di codice aiuterebbe. Inoltre, guarda cosa sta facendo l'applicazione durante il processo di caricamento. – NotMe

+0

Abbiamo gli stessi problemi con un'applicazione Winforms distribuita con Clickonce –

risposta

0

non vedono mai questo accada in XP, Vista e solo 7

forse è un bug in Vista ...?

Cosa succede se si chiama SetForegroundWindow() (o equivalente in .Net)?

Modifica

ho fatto, naturalmente, significa "BringWindowToTop()".

Oppure fare entrambe le cose.

+0

Bug in Vista o no, l'utente finale non si cura di chi è colpa, succede nella nostra app (e alcuni altri che non riesco a ricordare) ma non al 90% di app là fuori, quindi negli occhi dell'utente è il nostro bug. – Davy8

0

Bene, una soluzione è usare un hack come this. Questo non è davvero quello che serve.

In genere la decisione se una finestra si troverà nella barra delle applicazioni o meno si basa sugli stili del bordo che utilizza. L'articolo che ho collegato fornisce un po 'più di dettagli. Il commento dell'articolo sulla finestra che ha un proprietario o meno è del tutto possibile molto rilevante per il tuo problema, dal momento che la finestra potrebbe in qualche modo ottenere un proprietario diverso quando viene lanciata dal programma di installazione.

Questo articolo è in VB ma è tutto basato su chiamate API quindi le informazioni fornite sono piuttosto indipendenti dal linguaggio.

1

Il solito motivo per questo è che la finestra principale dell'applicazione non ha gli stili di finestra che consentono a Windows di sapere che è una finestra principale dell'applicazione (anziché una finestra degli strumenti o una finestra di dialogo). Quindi Windows deve indovinare in base a come è stata avviata l'applicazione, ecc.

Utilizzare Spy ++ per complare gli stili di finestra (specialmente gli stili estesi) se la finestra è quella di un'altra finestra che non presenta questo problema. Ti manca lo stile WS_EX_APPWINDOW? Esistono altri stili/stili estesi diversi dalle altre finestre di livello superiore?

0

Abbiamo avuto lo stesso problema e l'abbiamo risolto impostando la proprietà form showintaskbar su true.

Strano che tutti gli OS di Windows non eseguano le app nello stesso modo!

3

Prova a verificare la proprietà principale del modulo "Confine del modulo". Se è ToolWindow (Fixed o Sizable), prova ad esempio modificandolo in FixedDialog. Questo ha risolto il problema nel mio caso.

+0

Qualcuno sa perché? – Moelbeck

0

Nella nostra situazione, questo è stato rintracciato fino alla proprietà di testo del modulo modificata nell'evento Load.

Dopo aver inserito questo in uno BeginInvoke, questo strano comportamento non è più accaduto.

Spero che questo aiuti chiunque altro.

Esempio

private void Form_Load(object sender, EventArgs e) 
{ 
    ... 
    ... 
    ... 
    // this needs to be inside a BeginInvoke otherwise it messes with the taskbar visibility 
    this.BeginInvoke(new Action(() => 
     { 
      this.Text = "Something new"; 
     })); 
    ... 
    ... 
    ... 
} 
1

risposta di G.So mi ha fatto trovare la soluzione per il mio problema, wich è stato causato dal fatto che ho avuto la mia forma considerevole dal lancio, ma impostato senza bordi nel vuoto carico.

Se qualcuno è interessato a come sono riuscito a mantenere il passaggio a bordi e lo hanno pop-up come dovrebbe nella barra delle applicazioni, senza alcun hack sporco .. ecco che è ..

Fai un nuovo evento dal modulo nell'evento "Mostrato" del modulo e inserisci qui la tua riga di codice per passare a borderless. Problema risolto :)

private void Form1_Shown(object sender, EventArgs e) 
    { 
     this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 
    } 

    and for the lazy ones ;) >>>> 

    this.Shown += new EventHandler(Form1_Shown); 

Grazie ancora G.So per chiarire cosa potrebbe causare questo in primo luogo.

0

Abbiamo riscontrato lo stesso problema, anche in Windows 8. A volte il modulo stava ricevendo correttamente lo stato attivo, ma diceva solo il 30% delle volte.

Abbiamo provato diverse soluzioni, ma in realtà quello che funzionava era la seguente:

private void OnFormShown(object sender, EventArgs e) 
{ 
    // Tell Windows that the Form is a main application window 
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 

    // Even if true, enforce the fact that we will the application on the taskbar 
    this.ShowInTaskbar = true; 

    // Put the window to the front and than back 
    this.BringToFront(); 
    this.TopMost = true; 
    this.TopMost = false; 

    // 'Steal' the focus. 
    this.Activate(); 
} 

Inoltre, assicurano anche non impostare il titolo del modulo durante l'evento Load.

1

Ho anche avuto difficoltà con questo problema, e ho trovato come un commento precedente ha detto, non è possibile avere nulla nell'evento Load() del modulo che modifica la proprietà FormBorderStyle. Sposta tutto ciò che lo modifica nell'evento Mostrato().