我正在寻找一种方法来解决我认为 WPF 的错误。这是该问题的最简化示例。显然,在这种情况下,它违背了 Window.Topmost 的目的,但它使问题变得非常简单。在实现 System.Windows.Window 时:
protected override void OnDeactivated(EventArgs e) {
this.Topmost = false;
base.OnDeactivated(e);
}
这不会可靠地阻止 Window 或其内容继续绘制另一个新激活的应用程序。例如,如果我单击记事本的文本区域,WPF 窗口将在记事本上绘制。如果我单击记事本的顶部(这对于我尝试过的大多数其他应用程序来说是典型的)我的 WPF 窗口将绘制直到 MOUSEUP 发生并且只有当它发生得足够快时。我可以反复 MOUSEDOWN 并且只要我的 MOUSEUP 不会太快落后于它,窗口就会保持在最上面。但是,在某些情况下,它会可靠地绘制在后面,这取决于我在哪个应用程序中单击的位置,或者如果我单击第二个应用程序,它永远不会在那个应用程序之上绘制。
注意:在实践中,我想要做的是使用一个透明的覆盖层,它“粘”在 Windows 窗体上。因此,在这种情况下,当用户与表单交互时,它已经在 99% 的时间内被停用。由于我无法可靠地关闭窗口的 TopMost,因此我的应用程序的不透明位继续浮动在其他应用程序之上。强制窗口渲染不会改变任何东西。
附加的屏幕截图显示了该错误如何在单击第二个应用程序时不会再次出现,但它仍位于第一个窗口的顶部(红色位来自我的应用程序)。