Usando um namespace de API UWP no PowerShell

Usando um namespace de API UWP no PowerShell

Eu estava procurando como usar um namespace para trabalhar com a tela de bloqueio do Windows 10 no PowerShell e me deparei com esta resposta:https://superuser.com/a/1062551/700258, no entanto, não diz nada sobre como importar ou adicionar esse namespace ao PowerShell para uso. Tentei procurar os arquivos DLL referenciados para os assemblies e eles não estavam no meu computador. Quando vejo que eles fazem parte da API Windows Desktop Extensions, saí e baixei o SDK do Windows 10, mas os arquivos DLL também não estavam nele. Como posso usar esta classe LockScreen do namespace Windows.System.UserProfile em um script do PowerShell?

Responder1

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 apenas diz que é uma classe UWP. Depois que o tipo for carregado, você poderá consultá-lo pelo nome (apenas a primeira parte: [Windows.System.UserProfile.LockScreen]neste caso).

O próximo truque é que os métodos do Windows Runtime são assíncronos e usam uma classe de tarefa assíncrona diferente dos métodos do .NET Framework. Chamá-los do PowerShell requer um pouco de infraestrutura extra que desenvolvi originalmente paraoutra 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
}

Awaitpode 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 de saída. AwaitActionpode ser usado para chamar funções que retornam um IAsyncAction, ou seja, aquelas que apenas fazem algo sem retornar resultado. Leva apenas o objeto de tarefa do WinRT.

Para esta aplicação, precisaremos doStorageFiletipo acessível também:

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

Agora podemos começar a chamar algumas funções. Primeiro usamosGetFileFromPathAsyncpara obter uma IStorageFileinstância da imagem da tela de bloqueio desejada:

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

Finalmente, passamos essa imagem paraSetImageFileAsyncpara definir o plano de fundo da tela de bloqueio:

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

As alterações devem entrar em vigor imediatamente.

informação relacionada