2016-01-12 46 views
5

我希望能夠通過使用DisplayRequest類來防止在使用我的應用程序時觸發屏幕保護程序,但我只想在它是活動應用程序時執行此操作。如果用戶切換到另一個窗口/應用程序,那麼我想要像一個好公民一樣行動,並再次允許屏幕保護程序。UWP:檢測應用程序獲得/失去焦點

我看不到一個明顯的方式來檢測UWP應用何時獲得/失去焦點(或被激活/停用)並且快速搜索不提供任何見解。任何人都可以將我指向正確的方向嗎?

+0

感謝兩位回答者 - 我實際上已經注意到窗口上有一個激活事件,但並沒有考慮到我也可以使用它來檢查應用何時被激活......當你知道! –

+0

不幸的是,它似乎有一個邊緣情況下,它不起作用。如果用戶在應用程序打開並處於活動狀態時將其設備置於睡眠狀態,即通過按下電源按鈕,則該窗口將指示它已停用,但*不*表示設備再次啓動時已重新激活,即使它目前是活動窗口:( –

回答

2

您不應該處理應用程序激活狀態的更改。請參閱How to prevent screen locks in your UWP apps

自動請求處理

無需任何額外的編碼,不過,你的RequestActive()調用也將被停用,當你的應用程序不再具有焦點,換句話說,當你的應用程序進入一個暫停狀態。在Windows Phone移動設備上以及在Tablet PC模式下的Windows 10 PC或Surface Pro上,「您的應用程序不再擁有焦點」意味着每當您的應用程序不再處於前臺時(順便提一下,快照應用程序仍被視爲處於前景中) 。但是,在桌面模式下的Windows 10 PC上,這意味着每當您的應用程序最小化時。在桌面模式下,請注意,即使另一個應用程序窗口覆蓋了您的應用程序窗口,UWP應用程序生命週期仍會將您的應用程序視爲在前臺運行。

真的很酷的事情是,當你的應用程序回到前臺或得到最小化時,RequestActive()調用會自動重新激活。你不必做一件事!

這也意味着,如果另一個應用程序恰好發出請求以保持顯示處於活動狀態,它就無法劫持同一設備上其他所有應用程序的行爲。只要用戶使用該應用程序,請求就會很好。一旦應用程序被解僱或最小化,即使應用程序忘記調用RequestRelease(),Windows 10也會回到常規的節能習慣。

最後,當您的應用程序終止時,所有剩餘的顯示活動請求會自動爲您清理。

這一切都是爲您的需求而製作的。

+0

輝煌 - 這是非常有意義的;如果只有文檔提到,當我以前看過它!謝謝! –

10

這其實很簡單:

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

我們可以使用CoreWindow.Activated event當UWP應用程序被激活或停用檢測。當窗口完成激活或取消激活時,將觸發此方法。對於UWP應用程序,我們通常只有一個窗口。因此,我們可以添加一些代碼,就像在Application.OnLaunched以下方法來檢測:

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); 
    } 
}; 

除此之外,您還可以使用CoreApplication.GetCurrentView methodCoreWindow.GetForCurrentThread method得到CoreWindow

1

我在主窗口上使用可見性更改事件。在應用程序中打開或關閉新窗口時,事件不會被解僱。

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 
    } 
} 
相關問題