
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
}
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 de saída. AwaitAction
pode 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 doStorageFile
tipo acessível também:
[Windows.Storage.StorageFile,Windows.Storage,ContentType=WindowsRuntime] | Out-Null
Agora podemos começar a chamar algumas funções. Primeiro usamosGetFileFromPathAsync
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])
Finalmente, passamos essa imagem paraSetImageFileAsync
para definir o plano de fundo da tela de bloqueio:
AwaitAction ([Windows.System.UserProfile.LockScreen]::SetImageFileAsync($image))
As alterações devem entrar em vigor imediatamente.