
我正在尋找如何使用命名空間在 PowerShell 中處理 Windows 10 鎖定螢幕,並找到了這個答案:https://superuser.com/a/1062551/700258,但它沒有說明如何將該命名空間匯入或新增至 PowerShell 以供使用。我嘗試查找程序集引用的 DLL 文件,但它們不在我的電腦上。當我看到它們是 Windows 桌面擴充 API 的一部分時,我出去下載了 Windows 10 SDK,但 DLL 檔案也不在其中。如何在 PowerShell 腳本中使用 Windows.System.UserProfile 命名空間中的 LockScreen 類別?
答案1
首先,您需要告訴 PowerShell 您要使用 UWP 類別:
[Windows.System.UserProfile.LockScreen,Windows.System.UserProfile,ContentType=WindowsRuntime] | Out-Null
第一部分是類別名,第二部分是 UWP 命名空間,第三部分只是表示它是一個 UWP 類別。載入類型後,您可以透過其名稱引用該類型(僅第一部分:[Windows.System.UserProfile.LockScreen]
在本例中。)
下一個技巧是 Windows 執行時間方法是非同步的,並且使用與 .NET Framework 方法不同的非同步任務類別。從 PowerShell 呼叫它們需要一些我最初開發的額外基礎設施另一個答案:
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
可用來呼叫傳回 an 的函數IAsyncOperation
,也就是那些產生值的函數。它採用 WinRT 任務物件和輸出類型。AwaitAction
可用於呼叫傳回 an 的函數IAsyncAction
,即那些只執行某些操作而不回傳結果的函數。它僅需要 WinRT 任務物件。
對於這個應用程序,我們需要StorageFile
類型也可存取:
[Windows.Storage.StorageFile,Windows.Storage,ContentType=WindowsRuntime] | Out-Null
現在我們可以開始呼叫一些函數了。首先我們使用GetFileFromPathAsync
取得IStorageFile
所需鎖定畫面影像的實例:
$image = Await ([Windows.Storage.StorageFile]::GetFileFromPathAsync('C:\path\to\image.ext')) ([Windows.Storage.StorageFile])
最後,我們將該圖像傳遞給SetImageFileAsync
設定鎖定螢幕背景:
AwaitAction ([Windows.System.UserProfile.LockScreen]::SetImageFileAsync($image))
更改應立即生效。