Verwenden eines UWP-API-Namespace in PowerShell

545
grwa

Ich habe nach einem Namespace für die Arbeit mit dem Windows 10-Sperrbildschirm in PowerShell gesucht und bin auf diese Antwort gestoßen : https://superuser.com/a/1062551/700258, sagt jedoch nichts über den Import aus oder fügen Sie diesen Namespace zur Verwendung in PowerShell hinzu. Ich habe versucht, nach den referenzierten DLL-Dateien für die Assemblys zu suchen, und diese waren nicht auf meinem Computer. Wenn ich sehe, dass sie Teil der Windows Desktop Extensions-API sind, habe ich das Windows 10-SDK heruntergeladen, aber die DLL-Dateien befanden sich auch nicht darin. Wie kann ich diese LockScreen-Klasse aus dem Windows.System.UserProfile-Namespace in einem PowerShell-Skript verwenden?

1

1 Antwort auf die Frage

0
Ben N

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 } 

Awaitkann 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. AwaitActionkann 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 StorageFileTyp, auf den zugegriffen werden kann:

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

Nun können wir einige Funktionen aufrufen. Zuerst verwenden wir GetFileFromPathAsynceine IStorageFileInstanz 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.