Files
LanMountainDesktop/LanMountainDesktop.Platform.Abstractions/IWindowPassthroughServices.cs
lincube 9b7a35ddd3 refactor: 新建 Platform 平台差异层,主工程 P/Invoke 全部迁出
- 新增 Platform.Abstractions(接口+NoOp+PlatformLog 日志桥)、
  Platform.Windows、Platform.MacOS、Platform.Android 四个项目
- 迁移电源管理、原生对话框、桌面层嵌入、窗口置底/区域穿透、
  DWM 互操作、图标服务、包标识查询等全部 Windows P/Invoke 实现
- 主工程保留静态工厂门面,调用点不变;DllImport 扫描为零
- 更新 WindowPassthroughServiceTests 指向新位置(20/20 通过)
2026-07-26 22:14:46 +09:00

69 lines
2.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Avalonia;
using Avalonia.Controls;
namespace LanMountainDesktop.Platform.Abstractions;
/// <summary>
/// 窗口置底服务接口。使组件窗口保持在桌面层Z 序最底)。
/// </summary>
public interface IWindowBottomMostService
{
void SetupBottomMost(Window window);
void SendToBottom(Window window);
PixelPoint GetScreenPosition(Window window);
bool SetScreenPosition(Window window, PixelPoint position, bool queueOnFailure = false);
bool IsBottomMostSupported { get; }
}
/// <summary>
/// 窗口交互区域定义。区域外的点击穿透到桌面。
/// </summary>
public readonly record struct WindowInteractiveRegion(
Rect Bounds,
double CornerRadius,
Matrix? ClientToRegionTransform = null,
Rect? ClientClipBounds = null,
double ClientClipCornerRadius = 0d);
/// <summary>
/// 区域点击穿透服务接口。
/// </summary>
public interface IRegionPassthroughService
{
void SetInteractiveRegions(Window window, IReadOnlyList<WindowInteractiveRegion> interactiveRegions);
void ClearInteractiveRegions(Window window);
bool IsRegionPassthroughSupported { get; }
}
/// <summary>
/// 无操作实现:非 Windows 平台窗口置底不可用。
/// </summary>
public sealed class NullWindowBottomMostService : IWindowBottomMostService
{
public bool IsBottomMostSupported => false;
public void SetupBottomMost(Window window) { }
public void SendToBottom(Window window) { }
public PixelPoint GetScreenPosition(Window window) => window.Position;
public bool SetScreenPosition(Window window, PixelPoint position, bool queueOnFailure = false)
{
window.Position = position;
return true;
}
}
/// <summary>
/// 无操作实现:非 Windows 平台区域穿透不可用。
/// </summary>
public sealed class NullRegionPassthroughService : IRegionPassthroughService
{
public bool IsRegionPassthroughSupported => false;
public void SetInteractiveRegions(Window window, IReadOnlyList<WindowInteractiveRegion> interactiveRegions) { }
public void ClearInteractiveRegions(Window window) { }
}