在 PowerShell 中使用 UWP API 命名空間

在 PowerShell 中使用 UWP API 命名空間

我正在尋找如何使用命名空間在 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))

更改應立即生效。

相關內容