Примечание: не дублировать это, так как я уже заявляю systemManagement вместимость.
ОБНОВЛЕНИЕ: API доступен только для устройств IoT, если вы хотите API для UWP, проголосуйте здесь.
У меня есть простое приложение UWP, которое имеет как целевую, так и минимальную версию 2004 (Build 19041). Пользовательский интерфейс просто имеет две кнопки «Завершение работы» и «Перезагрузка»:
private void OnShutDownClicked(object sender, RoutedEventArgs e)
{
ShutdownManager.BeginShutdown(ShutdownKind.Shutdown, TimeSpan.FromSeconds(1));
}
private void OnRestartCLicked(object sender, RoutedEventArgs e)
{
ShutdownManager.BeginShutdown(ShutdownKind.Restart, TimeSpan.Zero);
}
Следуя документу, я добавил systemManagement емкость в манифест с помощью пользовательского интерфейса, а также перепроверил XML-код:
<Package
xmlns = "http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:mp = "http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:uap = "http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:iot = "http://schemas.microsoft.com/appx/manifest/iot/windows10"
IgnorableNamespaces = "uap mp iot">
...
<Capabilities>
<iot:Capability Name = "systemManagement"/>
</Capabilities>
...
Тем не менее, я все еще получаю UnauthorizedAccessException при выполнении кода, независимо от того, какой код я запускаю (завершение работы или перезапуск). Я уже пытался удалить приложение и снова загрузить его из VS.
System.UnauthorizedAccessException: «Доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))'
Я что-то пропустил? Как решить эту проблему?
ОБНОВЛЕНИЕ: поэтому я попытался добавить эту строку, чтобы проверить, действительно ли у меня есть доступ к этой емкости:
var temp = ShutdownManager.IsPowerStateSupported(PowerState.ConnectedStandby);
Согласно doc, этот метод также требует такой же емкости. Тем не менее, код хорошо работает через него. Это означает, что что-то должно отсутствовать в BeginShutdown:
ОБНОВЛЕНИЕ 2. Очевидно, этот API предназначен только для устройств IoT? Могу ли я использовать этот API на устройстве с Windows Desktop или есть ли аналогичный API? Google всегда приводил меня туда, и альтернативы, похоже, не было.
@MickyD Я не знаю об этой проблеме. В этом случае необходимо дождаться официального ответа от MS. Я также подозреваю, что это только API-интерфейс устройства IoT, и я использую (и намерен использовать его на) настольную Windows. Кстати, почему тег winrt (window-runtime) удален? Я думал, что это WinRT или это даже другая платформа (я знаю, что платформы MS сбивают с толку)?
Ой, извините, я не знал, что вы на самом деле используете WinRT API. Как правило, UWP — это не WinRT. :)
@MickyD Подождите, правда, лол? Почему? Я думал, что UWP и WinRT — это одно и то же (может быть, UWP = WinRT + XAML UI?). Я готов к уроку истории, если вы можете связать меня с ним :)
Нет, WinRT — это API на основе COM, изначально разработанный для первых планшетов Microsoft.





Этот API предназначен для устройств IoT, и эта функция не поддерживается в приложениях UWP. Приложения UWP работают в изолированной программной среде, поэтому приложения UWP имеют ограниченный доступ к системным ресурсам и не имеют доступа к таким системным функциям, как выключение устройства.
Спасибо за подтверждение. Будет ли когда-нибудь доступен такой API? Кто-нибудь предлагал что-то подобное, или команда решила, что этого никогда не будет?
@LukeVo Вы можете отправить запрос на эту функцию в Центре обратной связи. Вы можете найти Центр обратной связи в меню «Пуск». Пожалуйста, выберите Платформа разработчика-> API Feedback в качестве категории при отправке запроса. Соответствующая команда проверит запрос.
Хммм... Я помню, когда UWP отказал в доступе к полному диску, даже когда ему было сказано разрешить его. Интересно, это что-то похожее?