【问题标题】:UWP: How to prevent screen lock when in full-screen mode?UWP:如何在全屏模式下防止屏幕锁定?
【发布时间】:2018-10-13 19:37:33
【问题描述】:

我熟悉许多关于如何在 UWP 应用程序处于活动状态时防止屏幕空白的文档(例如 this article)。它在我的应用程序中运行良好,除非我使用 ApplicationView.TryEnterFullScreenMode 方法将我的应用程序置于全屏模式。当应用程序处于全屏状态时,在闲置几分钟后屏幕将变为空白(取决于 Windows 设置)。如何在应用处于全屏模式时防止屏幕锁定/黑屏?

【问题讨论】:

  • 全屏模式不应覆盖DisplayRequest.RequestActive 设置。你确定你打电话给RequestActive吗?也可以全屏后调用吗?

标签: uwp


【解决方案1】:

我已经在全屏模式下测试了RequestActive,它也运行良好。为了确保您调用了 RequestActive 方法,您可以定义 bool _isRequest 以维护 RequestActive() 被调用。

private bool _isRequest;
public void ActivateDisplay()
{
    //create the request instance if needed
    if (_displayRequest == null)
        _displayRequest = new Windows.System.Display.DisplayRequest();

    //make request to put in active state
    _displayRequest.RequestActive();
    _isRequest = true;
    info.Text = _isRequest.ToString();
}

public void ReleaseDisplay()
{
    //must be same instance, so quit if it doesn't exist
    if (_displayRequest != null && _isRequest)
    {
        _displayRequest.RequestRelease();
        _isRequest = false;
        info.Text = _isRequest.ToString();
    }
    else return;
}

【讨论】:

  • 这也是我正在做的事情,当应用程序不处于全屏模式时它工作正常。在您的测试用例中,您是否在进入全屏模式后等待调用 ActivateDisplay?就我而言,我不是——应用程序一开始就调用了 ActivateDisplay,然后用户可以在此之后进入全屏模式。进入全屏模式后,我猜显示器没有激活,因为发生了睡眠,但是当我退出全屏模式时,它又可以工作了。 (不,ReleaseDisplay 没有被调用。)
  • 无论是在进入全屏之前还是之后调用·ActivateDisplay·,在我这边都可以正常工作。你能介意分享一个迷你样品吗?如果你愿意,我可以将我的演示发布到 github。
【解决方案2】:

经过进一步研究,这是我的发现:

如果应用程序已经调用了DisplayRequest.RequestActive 并且然后 进入全屏模式(调用ApplicationView.TryEnterFullScreenMode),那么它不起作用。 (换句话说,应用程序不会阻止睡眠的发生。)

如果应用已经调用了DisplayRequest.RequestActive,然后进入全屏模式,然后再次尝试调用DisplayRequest.RequestActive,它仍然不起作用。

但是,如果应用程序已经调用了DisplayRequest.RequestActive,并且当它想要进入全屏模式时,在调用ApplicationView.TryEnterFullScreenMode之前调用DisplayRequest.RequestRelease,然后在进入全屏模式后调用DisplayRequest.RequestActive,那么它会工作。

退出全屏模式时也是如此。

因此,对 Nico 代码的这种更改将起作用:

private bool _isRequest;
public void ActivateDisplay()
{
    //create the request instance if needed
    if (_displayRequest == null)
        _displayRequest = new Windows.System.Display.DisplayRequest();

    //make request to put in active state
    _displayRequest.RequestActive();
    _isRequest = true;
    info.Text = _isRequest.ToString();
}

public void ReleaseDisplay()
{
    //must be same instance, so quit if it doesn't exist
    if (_displayRequest != null && _isRequest)
    {
        _displayRequest.RequestRelease();
        _isRequest = false;
        info.Text = _isRequest.ToString();
    }
    else return;
}

public void EnterFullScreen()
{
    ApplicationView applicationView = ApplicationView.GetForCurrentView();
    applicationView.FullScreenSystemOverlayMode = FullScreenSystemOverlayMode.Minimal;
    bool wasRequest = _isRequest;
    if (wasRequest)
    {
        ReleaseDisplay();
    }
    applicationView.TryEnterFullScreenMode();
    if (wasRequest)
    {
        ActivateDisplay();
    }
}

public void ExitFullScreen()
{
    ApplicationView applicationView = ApplicationView.GetForCurrentView();
    applicationView.FullScreenSystemOverlayMode = FullScreenSystemOverlayMode.Standard;
    bool wasRequest = _isRequest;
    if (wasRequest)
    {
        ReleaseDisplay();
    }
    applicationView.ExitFullScreenMode();
    if (wasRequest)
    {
        ActivateDisplay();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2020-06-10
    • 2020-01-13
    相关资源
    最近更新 更多