Использование пространства имен UWP API в PowerShell

Использование пространства имен UWP API в PowerShell

Я искал, как использовать пространство имен для работы с экраном блокировки Windows 10 в PowerShell, и наткнулся на этот ответ:https://superuser.com/a/1062551/700258, однако в нем ничего не говорится о том, как импортировать или добавить это пространство имен в PowerShell для использования. Я попытался найти указанные файлы DLL для сборок, но их не оказалось на моем компьютере. Когда я увидел, что они являются частью API Windows Desktop Extensions, я пошел и загрузил Windows 10 SDK, но файлов DLL там тоже не оказалось. Как я могу использовать этот класс LockScreen из пространства имен Windows.System.UserProfile в скрипте PowerShell?

решение1

Сначала вам нужно сообщить PowerShell, что вы хотите использовать класс UWP:

[Windows.System.UserProfile.LockScreen,Windows.System.UserProfile,ContentType=WindowsRuntime] | Out-Null

Первая часть — это имя класса, вторая — пространство имен UWP, а третья просто говорит, что это класс UWP. После загрузки типа вы можете ссылаться на тип по его имени ( [Windows.System.UserProfile.LockScreen]в данном случае только по первой части).

Следующий трюк заключается в том, что методы Windows Runtime являются асинхронными и используют другой класс асинхронных задач, чем методы .NET Framework. Вызов их из PowerShell требует немного дополнительной инфраструктуры, которую я изначально разработал длядругой ответ:

Add-Type -AssemblyName System.Runtime.WindowsRuntime
$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0]
Function Await($WinRtTask, $ResultType) {
    $asTask = $asTaskGeneric.MakeGenericMethod($ResultType)
    $netTask = $asTask.Invoke($null, @($WinRtTask))
    $netTask.Wait(-1) | Out-Null
    $netTask.Result
}
Function AwaitAction($WinRtAction) {
    $asTask = ([System.WindowsRuntimeSystemExtensions].GetMethods() | ? { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and !$_.IsGenericMethod })[0]
    $netTask = $asTask.Invoke($null, @($WinRtAction))
    $netTask.Wait(-1) | Out-Null
}

Awaitможет использоваться для вызова функций, которые возвращают IAsyncOperation, т. е. тех, которые производят значение. Он принимает объект задачи WinRT и тип выходных данных. AwaitActionможет использоваться для вызова функций, которые возвращают IAsyncAction, т. е. тех, которые просто что-то делают, не возвращая результат. Он принимает только объект задачи WinRT.

Для этого приложения нам понадобитсяStorageFileтип также доступен:

[Windows.Storage.StorageFile,Windows.Storage,ContentType=WindowsRuntime] | Out-Null

Теперь мы можем начать вызывать некоторые функции. Сначала мы используемGetFileFromPathAsyncчтобы получить IStorageFileэкземпляр нужного изображения экрана блокировки:

$image = Await ([Windows.Storage.StorageFile]::GetFileFromPathAsync('C:\path\to\image.ext')) ([Windows.Storage.StorageFile])

Наконец, мы передаем это изображениеSetImageFileAsyncчтобы установить фон экрана блокировки:

AwaitAction ([Windows.System.UserProfile.LockScreen]::SetImageFileAsync($image))

Изменения должны вступить в силу немедленно.

Связанный контент