Я искал, как использовать пространство имен для работы с экраном блокировки Windows 10 в PowerShell, и наткнулся на этот ответ: https://superuser.com/a/1062551/700258, однако он ничего не говорит о том, как импортировать или добавьте это пространство имен в PowerShell для использования. Я попытался найти ссылки на DLL-файлы для сборок, но их не было на моем компьютере. Когда я вижу, что они являются частью API расширений рабочего стола Windows, я вышел и загрузил Windows 10 SDK, но файлы DLL тоже не входили в этот список. Как я могу использовать этот класс LockScreen из Windows.Система.Пространство имен UserProfile в скрипте PowerShell?
1 ответ
Сначала вам нужно сообщить PowerShell, что вы хотите использовать класс UWP:
[Windows.System.UserProfile.LockScreen,Windows.System.UserProfile,ContentType=WindowsRuntime] | Out-Null
Первая часть - это имя класса, вторая - пространство имен UWP, а третья просто говорит, что это класс UWP. После загрузки типа вы можете ссылаться на тип по его имени (только первая часть: [Windows.System.UserProfile.LockScreen]
в этом случае.)
Следующий трюк заключается в том, что методы среды выполнения Windows являются асинхронными и используют другой класс асинхронных задач, чем методы .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))
Изменения должны вступить в силу немедленно.