是否可以使 JFrame 始终位于应用程序之上。运行 OpenGL 和 DirectX?

发布于 2024-10-14 19:46:14 字数 347 浏览 4 评论 0原文

我目前正在使用 Java 开发一个通知应用程序。

我需要窗口很快(大约 10 秒)位于任何应用程序之上。包括运行 OpenGL 和 DirectX 的程序(例如计算机游戏)。我知道 JFrame.setAlwaysOnTop(true); 仅适用于基于窗口的环境,而 OpenGL 和 DirectX 则不然。 考虑过 OpenGL 绑定,但似乎找不到任何有关 DirectX 的信息?

也许可以使用JNI? 欢迎任何想法:-)

编辑:感谢大家的回答,但我实际上放弃了它并决定强制游戏(我正在为其制作叠加层)处于窗口全屏模式。我只需要等待,看看 beta 测试人员对降低的 fps 有何评论:-) 再次感谢

I am currently working on a notification app, using Java.

I need for the window to be shortly (about 10 sec.) on top of any apps. including the ones running OpenGL and DirectX (e.g. computer games). I know that the JFrame.setAlwaysOnTop(true); only works in window based environments, which OpenGL and DirectX is not.
Thought about the OpenGL bindings, but can't seem to find anything about DirectX?

Maybe it is possible using JNI?
Any ideas are welcome :-)

Edit: Thanks for the answers guys, but I actually gave up on it and decided to force the game, of which I am making the overlay for, in windowed fullscreen mode. I´ll just have to wait and see what the beta-testers have to say about the reduced fps :-) thanks again

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

天生の放荡 2024-10-21 19:46:14

不要为 directx 和 java 烦恼。这存在阻抗不匹配。 Java是跨平台的,OpenGL是跨平台的。如果您坚持使用 directx,您可以尝试 SWT,因为它使用本机操作系统资源,您可能有机会。

对于 opengl,您正在寻找的是画布与 panel/jframe 的集成,您可以使用 JOGL 来实现。我认为 lwjgl 也有一个实现,但 jogl 更好。然后你可以在该jframe上设置alwaysOnTop。

kenai.com/projects/jogl

Don't bother with directx and java. That has an impedance mismatch. Java is cross platform, OpenGL is cross platform. If you insist on using directx you can try SWT since it uses native operating system resources you might have a chance.

For opengl what you are looking for is canvas integration with panel/jframe, you can use JOGL for that. I think lwjgl has a implementation too, but the jogl one is better. Then you can set the alwaysOnTop on that jframe.

kenai.com/projects/jogl

病女 2024-10-21 19:46:14

您的问题与您的代码无关,而是与图形设备有关。
该设备在全屏模式下只能有一个加速表面。这就是为什么如果您有双头 GPU,则无法全屏启动两个 DirectX 游戏的原因。

最好的办法是尝试找到 DX/OpenGL 表面指针并使用所需的 API 附加到它。我不知道这是否可以在 Java 中完成,但是方法是:

  • 获取指向正在运行的游戏或应用程序的加速表面的指针
  • 创建加速图形设备
  • 从 UI 创建非 mimpap 纹理(屏幕截图)
  • 获取指向纹理表面的指针
  • 表面的拉伸矩形
  • 使用从该表面到您在步骤 1 中获得的

如果不为每一帧使用 Vsync 和刷新率同步重复,这可能会导致闪烁。这也可能会导致帧速率大幅下降。

FRAPS 就是一个例子,它在加速应用程序上绘制当前帧速率。

Your problem is not related to your code but the graphic device instead.
The device can have only one accelerated surface in full screen mode. This is Why you cannot launch two DirectX games in fullscreen if you have a dueal head GPU.

Your best bet is to try to find the DX/OpenGL surface pointer and attach to it using the required APIs. I don't know if this can be done in Java however the approach woul be:

  • get a pointer to the accelerated surface of the game or app that is running
  • create an accelerated graphic device
  • create a non-mimpap texture(screenshot) from your UI
  • get a pointer to the texture surface
  • use the stretch rectangle from this surface to the one you got in step 1
  • present

This may introduce flickering if not using Vsync and refresh rate synched repetition for each frame. This may introduce a substantial framerate drop too.

One example of this is FRAPS, that draws the current framerate on the accelerated app.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文