我正在寻找如何使用命名空间在 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
可用于调用返回 的函数IAsyncOperation
,即产生值的函数。它采用 WinRT 任务对象和输出类型。AwaitAction
可用于调用返回 的函数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))
更改应立即生效。