在 Windows 上,当您使用ALT+ SHIFT (反之亦然)切换语言时,会在显示所选语言的所有窗口顶部出现一个窗口。
在 WPF 应用程序中,必须实现相同的窗口:
我已经实现了一个带有属性的窗口,Topmost=true因此它始终位于所有窗口的顶部。但是有一个问题——当你打开这个窗口时,它会最小化所有全屏应用程序。也就是说,如果我在任何全屏游戏中打开它,游戏窗口都会崩溃。同时,Windows 布局切换窗口不会发生这种情况。
据我了解,Windows 不使用窗口,而是使用诸如 Discord 之类的叠加层。但是 Discord 会寻找正在运行的游戏,而 Windows 窗口可以绘制在任何窗口之上。
如何实现相同的窗口?最好不使用 DirectX 库,以便此覆盖不仅适用于特定窗口

由于必须为特定的窗口绘制 DirectX 叠加层,而我需要在一般所有窗口之上实现这个窗口,所以我决定放弃绘制叠加层的想法。
事实上,解决方案就在表面上。用提示找到它
Alexander Petrov。首先要做的是设置 window 属性
Topmost="True",使该窗口始终位于其他窗口之上。而且ShowInTaskbar="False",这样窗口在打开时不会最小化出现在任务栏上的全屏应用程序。在这种情况下,在任何情况下都不应激活它,即调用
Focus()andActivate()以使窗口不拦截其他窗口的焦点。一般来说,这是可行的,但如果你不小心用鼠标点击了窗口,它仍然会获得焦点。为避免这种情况,您可以重写该方法
OnSourceInitialized()并阻止窗口接收焦点。在这里找到了解决方案。在问题的原始版本中,我还注意到窗口需要焦点才能触发事件
KeyDown以跟踪某些按键。关闭窗口焦点后,KeyDown无法使用该事件。相反,您可以使用全局热键,通过一个包NHotkey.Wpf(可以通过安装NuGet)