Можно ли сделать JFrame всегда поверх приложений. работаете с OpenGL и DirectX?

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

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

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

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


person user498388    schedule 26.01.2011    source источник
comment
Вы ошибаетесь насчет OpenGL. OpenGL не имеет специального полноэкранного режима. В OpenGL, если приложение является полноэкранным, это просто обычное полноэкранное окно без полей и украшений.   -  person datenwolf    schedule 26.01.2011
comment
хорошо.. JFrame.setAlwaysOnTop(true); не находится сверху, когда запущена игра OpenGL. (Java-приложение запускается через 20 секунд после открытия игры)   -  person user498388    schedule 26.01.2011
comment
вы не можете перейти в полноэкранный режим   -  person bestsss    schedule 29.01.2011
comment
несколько связано, blogs.msdn.com/b/oldnewthing /архив/2011/03/10/10138969.aspx   -  person sbridges    schedule 22.03.2011


Ответы (2)


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

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

kenai.com/projects/jogl

person Justin Dennahower    schedule 23.03.2011

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

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

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

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

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

person Marino Šimić    schedule 24.03.2011