5ce2c8a982
为 Claude Code 提供原生 Windows toast 通知:点击跳回原窗口、切回 Windows Terminal 标签、跨虚拟桌面、调用方图标、非阻塞投递;NativeAOT 单文件分发。
44 lines
1.1 KiB
C#
44 lines
1.1 KiB
C#
using System;
|
|
using System.IO;
|
|
|
|
namespace Notify.Ipc;
|
|
|
|
/// <summary>
|
|
/// Host 侧:监视 spool 目录,新文件出现即消费并回调
|
|
/// </summary>
|
|
public sealed class SpoolWatcher
|
|
{
|
|
private readonly Action<NotifyMessage> _onMessage;
|
|
private FileSystemWatcher? _watcher;
|
|
|
|
public SpoolWatcher(Action<NotifyMessage> onMessage) => _onMessage = onMessage;
|
|
|
|
public void Start()
|
|
{
|
|
Directory.CreateDirectory(NotificationSpool.Dir);
|
|
|
|
// 先补弹启动前堆积的请求
|
|
NotificationSpool.DrainExisting(_onMessage);
|
|
|
|
_watcher = new FileSystemWatcher(NotificationSpool.Dir, "*.json")
|
|
{
|
|
NotifyFilter = NotifyFilters.FileName,
|
|
EnableRaisingEvents = true,
|
|
};
|
|
_watcher.Created += OnCreated;
|
|
_watcher.Renamed += OnRenamed;
|
|
}
|
|
|
|
private void OnCreated(object sender, FileSystemEventArgs e) => Handle(e.FullPath);
|
|
|
|
private void OnRenamed(object sender, RenamedEventArgs e) => Handle(e.FullPath);
|
|
|
|
private void Handle(string path)
|
|
{
|
|
if (NotificationSpool.ReadAndRemove(path) is { } msg)
|
|
{
|
|
_onMessage(msg);
|
|
}
|
|
}
|
|
}
|