
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
}
Await
se 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. AwaitAction
se 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 elStorageFile
tipo accesible también:
[Windows.Storage.StorageFile,Windows.Storage,ContentType=WindowsRuntime] | Out-Null
Ahora podemos empezar a llamar a algunas funciones. Primero usamosGetFileFromPathAsync
para obtener una IStorageFile
instancia 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 aSetImageFileAsync
para configurar el fondo de la pantalla de bloqueo:
AwaitAction ([Windows.System.UserProfile.LockScreen]::SetImageFileAsync($image))
Los cambios deberían entrar en vigor inmediatamente.