Можно ли сделать JFrame всегда поверх приложений.работает OpenGL и DirectX? - PullRequest
3 голосов
/ 26 января 2011

В настоящее время я работаю над приложением уведомлений с использованием Java.

Мне нужно, чтобы окно было в скором времени (около 10 секунд) поверх любых приложений. в том числе с запущенными OpenGL и DirectX (например, компьютерные игры). Я знаю, что JFrame.setAlwaysOnTop(true); работает только в оконных средах, а OpenGL и DirectX - нет. Задумывались о связках OpenGL, но не можете найти что-нибудь о DirectX?

Может быть, это возможно с помощью JNI? Любые идеи приветствуются: -)

Edit: Спасибо за ответы, ребята, но я на самом деле отказался от этого и решил принудительно запустить игру, для которой я делаю оверлей, в полноэкранном режиме с окнами. Мне просто нужно подождать и посмотреть, что бета-тестеры скажут о сниженном fps :-) еще раз спасибо

Ответы [ 2 ]

0 голосов
/ 24 марта 2011

Ваша проблема связана не с вашим кодом, а с графическим устройством. Устройство может иметь только одну ускоренную поверхность в полноэкранном режиме. Вот почему вы не можете запускать две игры DirectX в полноэкранном режиме, если у вас есть графический процессор с дуэльной головкой.

Лучше всего попытаться найти указатель поверхности DX / OpenGL и прикрепить его с помощью необходимых API. Я не знаю, можно ли это сделать на Java, но подход будет следующим:

  • получить указатель на ускоренную поверхность игры или приложения, которое работает
  • создание ускоренного графического устройства
  • создать текстуру без mimpap (скриншот) из вашего пользовательского интерфейса
  • получить указатель на текстуру поверхности
  • используйте прямоугольник растяжения от этой поверхности до того, который вы получили в шаге 1
  • Настоящий

Это может привести к мерцанию, если не используется Vsync, и частота повторения синхронизируется для каждого кадра. Это также может привести к значительному снижению частоты кадров.

Одним из примеров этого является FRAPS, который рисует текущую частоту кадров в ускоренном приложении.

0 голосов
/ 23 марта 2011

Не беспокойтесь о DirectX и Java. Это имеет несоответствие импеданса. Java - кроссплатформенная, OpenGL - кроссплатформенная. Если вы настаиваете на использовании DirectX, вы можете попробовать SWT, поскольку он использует собственные ресурсы операционной системы, у вас может быть шанс.

Для opengl вам нужна интеграция canvas с panel / jframe, для этого вы можете использовать JOGL. Я думаю, что у lwjgl есть реализация, но jogl лучше. Затем вы можете установить AlwaysOnTop для этого jframe.

kenai.com / проекты / JOGL

...