Zuerst müssen Sie PowerShell mitteilen, dass Sie eine UWP-Klasse verwenden möchten:
[Windows.System.UserProfile.LockScreen,Windows.System.UserProfile,ContentType=WindowsRuntime] | Out-Null
Der erste Teil ist der Klassenname, der zweite ist der UWP-Namespace und der dritte Teil besagt, dass es sich um eine UWP-Klasse handelt. Nachdem der Typ geladen wurde, können Sie über den Namen auf den Typ verweisen (nur der erste Teil: [Windows.System.UserProfile.LockScreen]
in diesem Fall).
Der nächste Trick besteht darin, dass Windows Runtime-Methoden asynchron sind und eine andere asynchrone Taskklasse verwenden als .NET Framework-Methoden. Um sie von PowerShell aus anzurufen, ist eine zusätzliche Infrastruktur erforderlich, die ich ursprünglich für eine andere Antwort entwickelt hatte :
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
kann verwendet werden, um Funktionen aufzurufen, die ein zurückgeben IAsyncOperation
, dh solche, die einen Wert erzeugen. Es nimmt das WinRT-Taskobjekt und den Typ der Ausgabe. AwaitAction
kann verwendet werden, um Funktionen aufzurufen, die ein zurückgeben IAsyncAction
, dh diejenigen, die etwas tun, ohne ein Ergebnis zurückzugeben. Es benötigt nur das WinRT-Taskobjekt.
Für diese Anwendung benötigen wir auch den StorageFile
Typ, auf den zugegriffen werden kann:
[Windows.Storage.StorageFile,Windows.Storage,ContentType=WindowsRuntime] | Out-Null
Nun können wir einige Funktionen aufrufen. Zuerst verwenden wir GetFileFromPathAsync
eine IStorageFile
Instanz des gewünschten Sperrbildschirms:
$image = Await ([Windows.Storage.StorageFile]::GetFileFromPathAsync('C:\path\to\image.ext')) ([Windows.Storage.StorageFile])
Zum Schluss übergeben wir dieses Bild SetImageFileAsync
, um den Hintergrund des Sperrbildschirms festzulegen:
AwaitAction ([Windows.System.UserProfile.LockScreen]::SetImageFileAsync($image))
Änderungen sollten sofort wirksam werden.