如何通过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
相关产品推荐
相关产品推荐

