保持所有其他Windows C / Java的Window OnTop

我一直在阅读并发现Java Swing无法保持在全屏应用程序之上而不会产生可怕的闪烁效果。 这是真的? 闪烁效果:我有一个线程,每200ms将frame.setAlwaysOnTop()更新为true。

如果它是我正在寻找替代方法来做到这一点,并阅读有关C / C ++ / C#s SetWindowsPos,看起来这将为我做。 但是,在我重写程序之前,我想知道是否允许我将程序放在另一个全屏应用程序之上。 谢谢

简短回答:不是,不是。

更长的答案:“全屏”应用程序以与普通Windows GUI应用程序不同的方式使用显示器。 它们的确切工作方式取决于应用程序和操作系统; 大多数人将利用DirectX或OpenGL API,允许应用程序直接操作代表屏幕的内存,以及访问GPU的加速function。 基本上创建一个GUI“窗口”(更像是一个面板)支持这些应用程序,它覆盖整个主显示屏并且“始终位于顶部”,防止桌面元素被绘制,因为它们总是在全屏幕后面应用程序在Z顺序中的窗口。 然后,应用程序可以“放松”访问代表该GUI窗口的显示矩形的内存,因此它可以操作单个像素,而无需使用消息循环来重新绘制该区域。

在这种情况下,显示器正在应用程序需要时绘制(实际上它总是“尽可能快”或“与下一次监视器扫描同步”),而不是在Windows GUI认为这是一个好时机时。 因此,当Windows认为这是一个好主意时,任何被绘制的东西都会闪烁; Windows在GUI的Z顺序中在应用程序的“窗口”上绘制“永远在顶部”窗口,然后应用程序通过直接在其矩形上绘制来回显窗口。 这会导致Windows无效并重绘窗口,循环继续。

解决方案不仅是制作一个“永远在线”的窗口,而且以某种方式从全屏应用程序窗口以编程方式“任务切换”到您的窗口。 这可能要求您的应用具有大多数托管运行时无法或不会授予的权限。 如果可能,那么当它发生时,全屏应用程序将最小化(这可能是或可能不是您的用户的巨大问题;无论您的应用程序试图告诉我,几乎肯定不值得最小化我的星际争霸2会话在网上混战中间)。