feat: Claude Code 原生 Windows 通知(C# / .NET 10 + Avalonia 12)

为 Claude Code 提供原生 Windows toast 通知:点击跳回原窗口、切回 Windows
Terminal 标签、跨虚拟桌面、调用方图标、非阻塞投递;NativeAOT 单文件分发。
This commit is contained in:
2026-06-22 18:05:15 +08:00
commit 5ce2c8a982
53 changed files with 3889 additions and 0 deletions
+82
View File
@@ -0,0 +1,82 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net10.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<LangVersion>latest</LangVersion>
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
<ApplicationManifest>app.manifest</ApplicationManifest>
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
<ApplicationIcon>Assets\claude.ico</ApplicationIcon>
<RootNamespace>Notify</RootNamespace>
<AssemblyName>notify</AssemblyName>
<Version>1.0.0</Version>
<IsAotCompatible>true</IsAotCompatible>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<!-- NativeAOT 发布配置(仅 publish 生效):单文件原生 exe -->
<PropertyGroup Condition="'$(PublishAot)' == 'true'">
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<StripSymbols>true</StripSymbols>
<DebuggerSupport>false</DebuggerSupport>
<OptimizationPreference>Size</OptimizationPreference>
</PropertyGroup>
<ItemGroup>
<AvaloniaResource Include="Assets\**" />
</ItemGroup>
<!-- 这些 UI 库未完全标注 trim/AOT 安全,整体保留避免裁剪导致运行时异常 -->
<ItemGroup Condition="'$(PublishAot)' == 'true'">
<TrimmerRootAssembly Include="Ursa" />
<TrimmerRootAssembly Include="Ursa.Themes.Semi" />
<TrimmerRootAssembly Include="Semi.Avalonia" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Avalonia" Version="12.0.4" />
<PackageReference Include="Avalonia.Desktop" Version="12.0.4" />
<PackageReference Include="Avalonia.Fonts.Inter" Version="12.0.4" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.2" />
<PackageReference Include="Semi.Avalonia" Version="12.0.3" />
<PackageReference Include="Irihi.Ursa" Version="2.0.1" />
<PackageReference Include="Irihi.Ursa.Themes.Semi" Version="2.0.1" />
</ItemGroup>
<!--
AOT 单文件:把 Skia / HarfBuzz / ANGLE 三个原生库静态链接进 exe
CoreUtils.SkiaSharp.Static 含 skia + libHarfBuzzSharp 的 .libCoreUtils.ANGLE.Static 含 ANGLE
两包各自的 .targets 会在 PublishAot 时自动追加 NativeLibrary,这里只补 DirectPInvoke 与系统 lib
版本对应:Avalonia 12 → SkiaSharp 3.119
-->
<ItemGroup>
<PackageReference Include="CoreUtils.SkiaSharp.Static" Version="3.119.0.1" />
<PackageReference Include="CoreUtils.ANGLE.Static" Version="7151.0.1" />
</ItemGroup>
<ItemGroup Condition="'$(PublishAot)' == 'true'">
<DirectPInvoke Include="libSkiaSharp" />
<DirectPInvoke Include="libHarfBuzzSharp" />
<DirectPInvoke Include="av_libglesv2" />
<!-- ANGLE 静态库需要的系统库 -->
<LinkerArg Include="gdi32.lib" />
<LinkerArg Include="user32.lib" />
<LinkerArg Include="d3d9.lib" />
<LinkerArg Include="dxgi.lib" />
<LinkerArg Include="dxguid.lib" />
<LinkerArg Include="synchronization.lib" />
</ItemGroup>
<!-- 静态链接后清理发布目录:动态原生 DLL、链接期 .lib、调试 .pdb 都不需要,只留 notify.exe -->
<Target Name="CleanAotSingleFileOutput" AfterTargets="Publish" Condition="'$(PublishAot)' == 'true'">
<ItemGroup>
<_AotJunk Include="$(PublishDir)*.dll" />
<_AotJunk Include="$(PublishDir)*.lib" />
<_AotJunk Include="$(PublishDir)*.pdb" />
</ItemGroup>
<Delete Files="@(_AotJunk)" />
</Target>
</Project>