Uso de un espacio de nombres de API para UWP en PowerShell

Uso de un espacio de nombres de API para UWP en PowerShell

Estaba buscando cómo usar un espacio de nombres para trabajar con la pantalla de bloqueo de Windows 10 en PowerShell y encontré esta respuesta:https://superuser.com/a/1062551/700258, sin embargo, no dice nada sobre cómo importar o agregar ese espacio de nombres a PowerShell para su uso. Intenté buscar los archivos DLL a los que se hace referencia para los ensamblados y no estaban en mi computadora. Cuando vi que son parte de la API de Extensiones de escritorio de Windows, salí y descargué el SDK de Windows 10, pero los archivos DLL tampoco estaban allí. ¿Cómo puedo usar esta clase LockScreen desde el espacio de nombres Windows.System.UserProfile en un script de PowerShell?

Respuesta1

Primero debes decirle a PowerShell que deseas usar una clase para UWP:

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

La primera parte es el nombre de la clase, la segunda es el espacio de nombres de UWP y la tercera simplemente dice que es una clase de UWP. Una vez cargado el tipo, puede hacer referencia al tipo por su nombre (solo la primera parte: [Windows.System.UserProfile.LockScreen]en este caso).

El siguiente truco es que los métodos de Windows Runtime son asíncronos y utilizan una clase de tarea asíncrona diferente a la de los métodos de .NET Framework. Llamarlos desde PowerShell requiere un poco de infraestructura adicional que desarrollé originalmente paraotra respuesta:

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
}

Awaitse puede utilizar para llamar funciones que devuelven un IAsyncOperation, es decir, aquellas que producen un valor. Toma el objeto de tarea de WinRT y el tipo de salida. AwaitActionse puede utilizar para llamar a funciones que devuelven un IAsyncAction, es decir, aquellas que simplemente hacen algo sin devolver un resultado. Solo se necesita el objeto de tarea de WinRT.

Para esta aplicación, vamos a necesitar elStorageFiletipo accesible también:

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

Ahora podemos empezar a llamar a algunas funciones. Primero usamosGetFileFromPathAsyncpara obtener una IStorageFileinstancia de la imagen de la pantalla de bloqueo deseada:

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

Finalmente, le pasamos esa imagen aSetImageFileAsyncpara configurar el fondo de la pantalla de bloqueo:

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

Los cambios deberían entrar en vigor inmediatamente.

información relacionada