我一直在阅读一些内容,发现 Java Swing 无法在没有可怕的闪烁效果的情况下保持在全屏应用程序之上。这是真的? 闪烁效果: 我有一个线程每 200 毫秒更新一次frame.setAlwaysOnTop() 为 true 。
如果是的话,我正在寻找一种替代方法来执行此操作,并且正在阅读有关 C/C++/C#s SetWindowsPos 的内容,看起来这会为我做这件事。但是,在重写程序之前,我想知道这是否允许我将程序保留在另一个全屏应用程序之上。 谢谢
最佳答案
简短回答:不完全是,不。
更长的答案:“全屏”应用程序使用显示的方式与普通 Windows GUI 应用程序不同。它们的具体工作方式取决于应用程序和操作系统;大多数将利用 DirectX 或 OpenGL API,这些 API 允许应用程序直接操作代表屏幕的内存,以及访问 GPU 的加速功能。这些应用程序基本上是通过创建一个 GUI“窗口”(更像是一个面板)来支持的,该窗口覆盖整个主显示屏并且“始终位于顶部”,从而防止桌面元素被绘制,因为它们在 Z 顺序中始终位于全屏应用程序窗口的后面。然后,应用程序可以“轻松”访问代表该 GUI 窗口显示矩形的内存,因此它可以操纵各个像素,而无需使用消息循环来重新绘制该区域。
在这种情况下,显示是在应用程序需要时绘制的(实际上总是“尽可能快”或“与下一次监视器扫描同步”),而不是在 Windows GUI 认为时机合适时绘制。因此,当 Windows 认为这是个好主意时所绘制的任何内容都会闪烁; Windows 在 GUI 的 Z 顺序中在应用程序的“窗口”上绘制“始终位于顶部”的窗口,然后应用程序通过直接在其矩形上绘制来在窗口上绘制。这会导致 Windows 失效并重绘您的窗口,然后循环继续。
解决方案不仅是创建一个“始终在最上面”的窗口,而且以某种方式以编程方式从全屏应用程序的窗口“任务切换”到您的窗口。这可能要求您的应用程序拥有大多数托管运行时无法或不会授予的权限。如果可能的话,那么当它发生时,全屏应用程序将最小化(这对于您的用户来说可能是也可能不是一个大问题;无论您的应用程序试图告诉我什么,几乎肯定不值得在在线混战中最小化我的《星际争霸 2》 session )。
关于java - 将窗口保持在所有其他窗口之上 C/Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9386051/