Usando um namespace da API UWP no PowerShell

1

Eu estava procurando como usar um namespace para trabalhar com a tela de bloqueio do Windows 10 no PowerShell e me deparei com essa resposta: link , no entanto, ele não diz nada sobre como importar ou adicionar esse namespace ao PowerShell para uso. Eu 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 do Windows Desktop Extensions, saí e baixei o SDK do Windows 10, mas os arquivos DLL também não estavam nele. Como posso usar essa classe LockScreen do namespace Windows.System.UserProfile em um script do PowerShell?

    
por grwa 20.07.2018 / 22:21

1 resposta

0

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.

    
por 23.07.2018 / 02:51