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