
Ich habe nach einer Möglichkeit gesucht, einen Namespace für die Arbeit mit dem Windows 10-Sperrbildschirm in PowerShell zu verwenden, und bin auf diese Antwort gestoßen:https://superuser.com/a/1062551/700258, allerdings steht dort nichts darüber, wie man diesen Namespace importiert oder in PowerShell zur Verwendung hinzufügt. Ich habe versucht, die referenzierten DLL-Dateien für die Assemblys zu finden, aber sie waren nicht auf meinem Computer. Als ich sah, dass sie Teil der Windows Desktop Extensions API sind, habe ich das Windows 10 SDK heruntergeladen, aber die DLL-Dateien waren auch darin nicht enthalten. Wie kann ich diese LockScreen-Klasse aus dem Windows.System.UserProfile-Namespace in einem PowerShell-Skript verwenden?
Antwort1
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 der UWP-Namespace und der dritte besagt lediglich, dass es sich um eine UWP-Klasse handelt. Nachdem der Typ geladen wurde, können Sie ihn über seinen Namen referenzieren ( [Windows.System.UserProfile.LockScreen]
in diesem Fall nur den ersten Teil).
Der nächste Trick besteht darin, dass Windows Runtime-Methoden asynchron sind und eine andere asynchrone Taskklasse verwenden als .NET Framework-Methoden. Der Aufruf aus PowerShell erfordert eine kleine zusätzliche Infrastruktur, die ich ursprünglich füreine andere Antwort:
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
, also solche, die einen Wert erzeugen. Es benötigt das WinRT-Taskobjekt und den Typ der Ausgabe. AwaitAction
kann verwendet werden, um Funktionen aufzurufen, die ein zurückgeben IAsyncAction
, also solche, die einfach etwas tun, ohne ein Ergebnis zurückzugeben. Es benötigt nur das WinRT-Taskobjekt.
Für diese Anwendung benötigen wirStorageFile
Typ auch zugänglich:
[Windows.Storage.StorageFile,Windows.Storage,ContentType=WindowsRuntime] | Out-Null
Nun können wir anfangen, einige Funktionen aufzurufen. Zuerst verwenden wirGetFileFromPathAsync
um eine IStorageFile
Instanz des gewünschten Sperrbildschirmbildes zu erhalten:
$image = Await ([Windows.Storage.StorageFile]::GetFileFromPathAsync('C:\path\to\image.ext')) ([Windows.Storage.StorageFile])
Schließlich geben wir das Bild weiter anSetImageFileAsync
So legen Sie den Hintergrund des Sperrbildschirms fest:
AwaitAction ([Windows.System.UserProfile.LockScreen]::SetImageFileAsync($image))
Änderungen sollten sofort wirksam werden.