Wpf Window.Topmost=false不能可靠地停止最顶端的行为

Wpf Window.Topmost=false不能可靠地停止最顶端的行为,wpf,topmost,Wpf,Topmost,我正在寻找一种方法来解决我认为WPF存在的bug。这是这个问题最简单的例子。显然,在这种情况下,它违背了Window.Topmost的目的,但它使问题变得非常简单。在实现System.Windows.Window时: protected override void OnDeactivated(EventArgs e) { this.Topmost = false; base.OnDeactivated(e); } 这不会可靠地防止窗口或其内容继续

我正在寻找一种方法来解决我认为WPF存在的bug。这是这个问题最简单的例子。显然,在这种情况下,它违背了Window.Topmost的目的,但它使问题变得非常简单。在实现System.Windows.Window时:

    protected override void OnDeactivated(EventArgs e) {
        this.Topmost = false;
        base.OnDeactivated(e);
    }
这不会可靠地防止窗口或其内容继续覆盖另一个新激活的应用程序。例如,如果我在记事本的文本区域中单击,WPF窗口将在记事本上绘制。如果我点击记事本顶部,这是我尝试过的大多数其他应用程序的典型情况,我的WPF窗口将一直画到鼠标点击出现,并且只有在鼠标点击足够快的时候才会画出来。我可以反复鼠标向下移动,只要我的鼠标不太快地落在窗口后面,窗口就会保持在最上面。然而,在某些情况下,它确实会落后,这取决于我在哪个应用程序中单击的位置,或者如果我单击第二个应用程序,它将永远不会在该应用程序之上绘制

注意:在实践中,我试图做的是使用一个粘贴到windows窗体上的透明覆盖层。因此,在这种情况下,当用户与表单交互时,它99%的时间都被停用。由于我无法可靠地关闭窗口的顶部,所以我的应用程序的不透明部分继续浮在其他应用程序的顶部。强制窗口渲染不会改变任何内容

所附的屏幕截图显示了该错误如何在点击第二个应用程序时不再出现,但它仍然停留在第一个窗口的顶部——红色部分来自我的应用程序


你可能得侵入winapi。这东西真让人讨厌。100%的一致性是困难的。更新:我放弃了Topmost,并能够通过WindowsInteropHelper使我的WPF窗口正确地服从winforms,如下所示: