You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 04:54:24