2016-01-12 18 views
5

Desidero essere in grado di impedire l'attivazione dello screen saver mentre la mia app è in uso utilizzando la classe DisplayRequest, ma voglio farlo solo mentre è l'app attiva. Se l'utente passa a un'altra finestra/app, voglio agire come un buon cittadino e consentire nuovamente lo screensaver.UWP: Rileva app guadagno/perdita fuoco

Non riesco a vedere un modo ovvio per rilevare quando un'app UWP ottiene/perde la messa a fuoco (o è attivata/disattivata) e una ricerca rapida in giro non offre alcun approfondimento. Qualcuno può indicarmi la giusta direzione?

+0

Grazie a entrambi i risponditori - avevo effettivamente notato che c'era un evento attivato su una finestra, ma non avevo considerato che avrei potuto usarlo anche per controllare quando l'app era * de * attivata ... facile quando lo sai ! –

+0

E sfortunatamente sembrerebbe che ci sia un caso limite in cui non funziona. Se l'utente mette il proprio dispositivo in stato di stop mentre l'app è aperta e attiva, ovvero premendo il pulsante di accensione, la finestra segnala che è stata disattivata, ma * non * indica che è stata riattivata all'avvio del dispositivo, anche se è attualmente la finestra attiva :( –

risposta

2

Non si devono gestire le modifiche dello stato di attivazione dell'app.

Si prega di fare riferimento a How to prevent screen locks in your UWP apps.

movimentazione

senza alcuna codifica supplementare, se richiesta automatica, il vostro RequestActive() chiamata verrà inoltre disattivato quando la vostra applicazione non ha più l'attenzione, in altre parole, quando la vostra applicazione va in un stato sospeso. Su Windows Phone mobile e su un PC Windows 10 o Surface Pro in modalità Tablet, "la tua app non ha più messa a fuoco" indica ogni volta che l'app non è più in primo piano (le app scattate contano ancora come in primo piano, tra l'altro) . Su un PC Windows 10 in modalità desktop, tuttavia, si intende ogni volta che la tua app è ridotta a icona. In modalità desktop, tieni presente che anche quando un'altra finestra dell'app copre la finestra dell'app, la tua app è ancora considerata dal ciclo di vita dell'app UWP in esecuzione in primo piano.

La cosa veramente interessante è che quando la tua app torna in primo piano o viene ridotta al minimo, la chiamata RequestActive() verrà automaticamente riattivata. Non devi fare niente!

Ciò significa anche che se un'altra app esegue una richiesta per mantenere attivo il display, non può dirottare il comportamento di ogni altra app sullo stesso dispositivo. La richiesta è valida solo se l'utente sta lavorando con quell'app. Una volta che l'app viene scaricata o ridotta a icona, Windows 10 torna alle normali abitudini di risparmio energetico, anche se l'app si dimentica di chiamare RequestRelease().

Infine, quando l'app viene interrotta, tutte le restanti richieste attive visualizzate vengono automaticamente ripulite.

È tutto fatto per le vostre esigenze.

+0

Brillante - questo ha perfettamente senso, se solo la documentazione avesse menzionato questo quando ci stavo guardando prima! Grazie! –

10

In realtà è abbastanza semplice:

Window.Current.Activated += Current_Activated; 

private void Current_Activated(object sender, Windows.UI.Core.WindowActivatedEventArgs e) 
{ 
    if (e.WindowActivationState == CoreWindowActivationState.Deactivated) 
    { 
     // do stuff 
    } 
    else 
    { 
     // do different stuff 
    } 
} 
6

Possiamo usare CoreWindow.Activated event per rilevare quando un'applicazione UWP viene attivato o disattivato. Questo metodo viene attivato quando la finestra completa l'attivazione o la disattivazione. E per un'app UWP, di solito abbiamo solo una finestra. Così possiamo aggiungere del codice come segue in Application.OnLaunched metodo per rilevare:

Window.Current.CoreWindow.Activated += (sender, args) => 
{ 
    if (args.WindowActivationState == Windows.UI.Core.CoreWindowActivationState.Deactivated) 
    { 
     System.Diagnostics.Debug.WriteLine("Deactivated " + DateTime.Now); 
    } 
    else 
    { 
     System.Diagnostics.Debug.WriteLine("Activated " + DateTime.Now); 
    } 
}; 

Oltre a questo, è anche possibile utilizzare CoreApplication.GetCurrentView method o CoreWindow.GetForCurrentThread method per ottenere il CoreWindow.

1

Uso l'evento di visibilità modificata nella finestra iniziale. L'evento non viene attivato quando si apre o si chiude una nuova finestra all'interno dell'app.

Window.Current.VisibilityChanged += OnVisibilityChanged; 

/// <summary> 
/// When the window visibility changes, the stuff happens 
/// </summary> 
/// <param name="sender">object sender</param> 
/// <param name="e">VisibilityChangedEventArgs e</param> 
private void OnVisibilityChanged(object sender, VisibilityChangedEventArgs e) 
{ 

    if (!e.Visible) 
    { 
     // do stuff 
    } 
    else 
    { 
     // do other stuff 
    } 
}