PowerShell에서 UWP API 네임스페이스 사용

PowerShell에서 UWP API 네임스페이스 사용

PowerShell에서 Windows 10 잠금 화면 작업을 위해 네임스페이스를 사용하는 방법을 찾고 있던 중 다음 답변을 발견했습니다.https://superuser.com/a/1062551/700258그러나 해당 네임스페이스를 PowerShell로 가져오거나 추가하여 사용하는 방법에 대해서는 아무 것도 알려주지 않습니다. 어셈블리에 대한 참조 DLL 파일을 찾으려고 했지만 해당 파일이 내 컴퓨터에 없었습니다. Windows Desktop Extensions API의 일부인 것을 보고 Windows 10 SDK를 다운로드했지만 DLL 파일도 그 안에 없었습니다. PowerShell 스크립트에서 Windows.System.UserProfile 네임스페이스의 이 LockScreen 클래스를 어떻게 사용할 수 있나요?

답변1

먼저 UWP 클래스를 사용하고 싶다고 PowerShell에 알려야 합니다.

[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
}

AwaitIAsyncOperation를 반환하는 함수 , 즉 값을 생성하는 함수 를 호출하는 데 사용할 수 있습니다 . WinRT 작업 개체와 출력 유형을 사용합니다. 를 반환하는 함수 , 즉 결과를 반환하지 않고 작업만 수행하는 AwaitAction함수를 호출하는 데 사용할 수 있습니다 . IAsyncActionWinRT 작업 개체만 사용됩니다.

이 애플리케이션에는 다음이 필요합니다.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))

변경사항은 즉시 적용됩니다.

관련 정보