1

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

1 ответ1

0

Сначала вам нужно сообщить 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))

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .