基本上,您希望显示一个不可聚焦且不响应输入的顶级全屏透明窗口。然后,您可以使用此窗口手动绘制覆盖。我认为最简单的方法是在 Window 上覆盖 OnRender 并绘制一个填充整个窗口但使用剪贴蒙版(通过 drawingContext.PushClip)排除您想要不覆盖的区域的矩形。
编辑:
这是一个例子:
窗口应该是这样设置的:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
AllowsTransparency="True"
WindowStyle="None"
WindowState="Maximized"
Topmost="False"
Background="{x:Null}"
IsHitTestVisible="False">
</Window>
WindowStyle 和WindowState设置将导致窗口最大化并与任务栏重叠。
Topmost 设置为 true 将导致窗口位于所有其他窗口的顶部,IsHitTestVisible 将导致鼠标单击“落空”。
警告:如果您设置此选项,您将遇到无法关闭的最顶层窗口,因为它不听键盘命令。 您需要在代码中的某处手动关闭窗口。您可能想要创建一个全局鼠标挂钩来监听鼠标向上,并创建一个键盘挂钩来监听 ESC 或其他内容。
在上面的示例中,为了让人们远离自己,我将 TopMost 设置为 False。只有在您知道如何/何时在代码中某处关闭窗口时才将其更改为 true。
Background 设置为 null,以便您可以在后面的代码中使用自定义绘图。
后面的代码类似这样:
public MainWindow()
{
InitializeComponent();
}
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
var screenGeometry = new RectangleGeometry(new Rect(0, 0, ActualWidth, ActualHeight));
var excludeRectangle = new RectangleGeometry(new Rect(200, 200, 150, 150));
drawingContext.PushClip(CombinedGeometry.Combine(screenGeometry,excludeRectangle, GeometryCombineMode.Exclude,null));
drawingContext.PushOpacity(.8);
drawingContext.DrawRectangle(Brushes.Black, null, new Rect(0, 0, ActualWidth, ActualHeight));
drawingContext.Pop();
drawingContext.Pop();
}
您将在哪里为 excludeRectangle 使用正确的位置和大小。
如果您运行此代码,您将看到屏幕显示为灰色,除了左上角的一个小矩形。