Search code examples
c#windows-8windows-runtime

Request lockscreen access throws exception hangs or throws exception in mscorlib.dll


I use the following method to request lockscreen access in WinRT:

public async void RequestLockScreenAccess()
    {
        var status = BackgroundExecutionManager.GetAccessStatus();
        if (status == BackgroundAccessStatus.Unspecified || status == BackgroundAccessStatus.Denied)
            status = await BackgroundExecutionManager.RequestAccessAsync();
        switch (status)
        {
            case BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity:
                _mainInfo.NotifyUser = "This app is on the lock screen and has access to Always-On Real Time Connectivity.";
                break;
            case BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity:
                _mainInfo.NotifyUser = "This app is on the lock screen and has access to Active Real Time Connectivity.";
                break;
            case BackgroundAccessStatus.Denied:
                _mainInfo.NotifyUser = "This app is not on the lock screen.";
                break;
            case BackgroundAccessStatus.Unspecified:
                _mainInfo.NotifyUser = "The user has not yet taken any action. This is the default setting and the app is not on the lock screen.";
                break;
        }
    }

This can give me 2 different errors. If i place a breakpoint before or on line

status = await BackgroundExecutionManager.RequestAccessAsync();

the code will execute, but throw the following exception:

An unhandled exception of type 'System.Exception' occurred in mscorlib.dll Additional information: Element not found. (Exception from HRESULT: 0x8002802B (TYPE_E_ELEMENTNOTFOUND))

As i read in another post, this is a bug known to others, don't know about Microsoft. If i don't place a breakpoint before this line, execution will instead hang. What am i doing wrong here?

It seems that if i uninstall my application, it might work, but then after some reruns it will eventually fail again.


Solution

  • There are two bugs I know when accessing for a lockscreen access. First one, if you have breakpoint on that line, then the execution will fail because your application is not running in foreground (you are in Visual Studio, not in your app) and the lockscreen dialog cannot find main windows of your app.

    Another problem occurs when running in Simulator - every call on GetAccessStatus throws an exception, because this call is basically not allowed in Simulator.

    If you want to debug this, then place your breakpoint after the GetAccessStatus call and test it on Local machine and it should just work.

    Update, I was also getting this exception when the RequestAccessAsync method is called on non-UI thread. When called on UI thread, it worked fine.