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

まず、UWP クラスを使用するように PowerShell に指示する必要があります。

[Windows.System.UserProfile.LockScreen,Windows.System.UserProfile,ContentType=WindowsRuntime] | Out-Null

最初の部分はクラス名、2 番目は UWP 名前空間、3 番目は 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は、 を返す関数IAsyncOperation、つまり値を生成する関数を呼び出すために使用できます。WinRT タスク オブジェクトと出力の型を受け取ります。 は、AwaitActionを返す関数、つまり結果を返さずに何かを実行する関数を呼び出すために使用できますIAsyncAction。WinRT タスク オブジェクトのみを受け取ります。

このアプリケーションでは、StorageFileタイプもアクセス可能:

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

さて、関数の呼び出しを開始してみましょう。まずはGetFileFromPathAsyncIStorageFile目的のロック画面画像のインスタンスを取得するには:

$image = Await ([Windows.Storage.StorageFile]::GetFileFromPathAsync('C:\path\to\image.ext')) ([Windows.Storage.StorageFile])

最後に、その画像をSetImageFileAsyncロック画面の背景を設定するには:

AwaitAction ([Windows.System.UserProfile.LockScreen]::SetImageFileAsync($image))

変更はすぐに有効になります。

関連情報