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

如何通过PInvoke/DllImport从轻量CLI应用发送UWP Toast通知?

用PInvoke实现轻量Windows通知区域通知

完全可以通过直接PInvoke调用Windows原生API Shell_NotifyIcon 实现,不需要任何额外依赖包,代码足够精简适配你的小CLI应用。

以下是完整实现代码:

using System;
using System.Runtime.InteropServices;

public static class TrayNotification
{
    [DllImport("shell32.dll", CharSet = CharSet.Unicode)]
    private static extern bool Shell_NotifyIcon(uint dwMessage, ref NOTIFYICONDATA lpData);

    private const uint NIM_ADD = 0x00000000;
    private const uint NIM_DELETE = 0x00000002;
    private const uint NIF_INFO = 0x00000010;

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    private struct NOTIFYICONDATA
    {
        public uint cbSize;
        public IntPtr hWnd;
        public uint uID;
        public uint uFlags;
        public uint uCallbackMessage;
        public IntPtr hIcon;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string szTip;
        public uint dwState;
        public uint dwStateMask;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        public string szInfo;
        public uint uTimeoutOrVersion;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
        public string szInfoTitle;
        public uint dwInfoFlags;
    }

    public static void Show(string title, string message)
    {
        var data = new NOTIFYICONDATA();
        data.cbSize = (uint)Marshal.SizeOf(data);
        data.hWnd = IntPtr.Zero;
        data.uID = 1;
        data.uFlags = NIF_INFO;
        data.szInfoTitle = title;
        data.szInfo = message;
        data.dwInfoFlags = 0;

        Shell_NotifyIcon(NIM_ADD, ref data);
        System.Threading.Thread.Sleep(5000);
        Shell_NotifyIcon(NIM_DELETE, ref data);
    }
}

// 调用示例
class Program
{
    static void Main()
    {
        TrayNotification.Show("CLI通知", "这是来自轻量CLI应用的通知");
    }
}

关键说明:

  • 仅依赖基础.NET类库,无任何额外NuGet包,完全适配极小应用体积需求
  • Shell_NotifyIcon是Windows原生系统API,无额外依赖负担
  • 代码通过NIM_ADD添加通知并显示,NIM_DELETE清理托盘图标避免残留;若需要更新通知内容,可使用NIM_MODIFY常量
  • 如需自定义通知图标,可将data.hIcon替换为目标图标句柄(比如SystemIcons.Information.Handle)

内容的提问来源于stack exchange,提问作者Digika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:50:31