如何在PowerShell中通过PInvoke调用SHQueryUserNotificationState?
解决PowerShell调用SHQueryUserNotificationState的异常问题
问题原因
你遇到的异常是因为将$state赋值为枚举类型本身,而非枚举的实例,导致传递引用时无法转换为有效的枚举值。
修正后的完整代码
Add-Type -TypeDefinition @' using System; using System.Runtime.InteropServices; public enum QUERY_USER_NOTIFICATION_STATE { QUNS_NOT_PRESENT = 1, QUNS_BUSY = 2, QUNS_RUNNING_D3D_FULL_SCREEN = 3, QUNS_PRESENTATION_MODE = 4, QUNS_ACCEPTS_NOTIFICATIONS = 5, QUNS_QUIET_TIME = 6 }; public class UserWindows { [DllImport("shell32.dll")] public static extern int SHQueryUserNotificationState(out QUERY_USER_NOTIFICATION_STATE pquns); } '@ # 声明变量为枚举类型,初始化为null即可 [UserWindows+QUERY_USER_NOTIFICATION_STATE]$state = $null # 调用函数,通过[ref]传递对应out参数 $hr = [UserWindows]::SHQueryUserNotificationState([ref]$state) # 检查调用结果 if ($hr -eq 0) { Write-Host "当前用户通知状态: $state" } else { Write-Host "调用失败,错误码: $hr" }
关键修正点
- 变量声明:使用
[UserWindows+QUERY_USER_NOTIFICATION_STATE]$state明确指定变量为枚举类型,而非赋值为类型本身。 - 参数传递:用
[ref]对应C#中的out参数,函数执行后会自动将当前状态赋值给$state。 - 结果校验:
SHQueryUserNotificationState返回HRESULT值,0(S_OK)表示调用成功,其他值代表失败。
内容的提问来源于stack exchange,提问作者arock
相关产品推荐
相关产品推荐

