
Я искал, как использовать пространство имен для работы с экраном блокировки 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))
Изменения должны вступить в силу немедленно.