Primeiro, você precisa informar ao PowerShell que deseja usar uma classe UWP:
[Windows.System.UserProfile.LockScreen,Windows.System.UserProfile,ContentType=WindowsRuntime] | Out-Null
A primeira parte é o nome da classe, a segunda é o namespace UWP e a terceira diz apenas que é uma classe UWP. Depois que o tipo é carregado, você pode se referir ao tipo pelo seu nome (apenas a primeira parte: [Windows.System.UserProfile.LockScreen]
neste caso).
O próximo truque é que os métodos do Tempo de Execução do Windows são assíncronos e usam uma classe de tarefa assíncrona diferente dos métodos do .NET Framework. Chamá-los do PowerShell requer uma pequena infraestrutura extra que eu desenvolvi originalmente para outra resposta :
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
pode ser usado para chamar funções que retornam um IAsyncOperation
, ou seja, aquelas que produzem um valor. Leva o objeto de tarefa do WinRT e o tipo da saída. AwaitAction
pode ser usado para chamar funções que retornam um IAsyncAction
, ou seja, aquelas que apenas fazem algo sem retornar um resultado. Leva apenas o objeto de tarefa do WinRT.
Para este aplicativo, precisaremos do StorageFile
tipo acessível também:
[Windows.Storage.StorageFile,Windows.Storage,ContentType=WindowsRuntime] | Out-Null
Agora podemos começar a chamar algumas funções. Primeiro, usamos GetFileFromPathAsync
para obter uma IStorageFile
instância da imagem da tela de bloqueio desejada:
$image = Await ([Windows.Storage.StorageFile]::GetFileFromPathAsync('C:\path\to\image.ext')) ([Windows.Storage.StorageFile])
Por fim, passamos essa imagem para SetImageFileAsync
para definir o plano de fundo da tela de bloqueio:
AwaitAction ([Windows.System.UserProfile.LockScreen]::SetImageFileAsync($image))
As alterações devem ter efeito imediatamente.