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

500
grwa

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

1

1 ответ на вопрос

0
Ben N

Сначала вам нужно сообщить 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может использоваться для вызова функций, которые возвращают an 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)) 

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