Сохранение Window OnTop всех других окон C / Java - PullRequest
1 голос
/ 22 февраля 2012

Я немного читал и обнаружил, что Java Swing не может оставаться поверх полноэкранных приложений без ужасного эффекта мерцания.Это правда?Эффект мерцания: у меня есть поток, который обновляет frame.setAlwaysOnTop () до true каждые 200 мс.

Если это так, я искал альтернативу методу, чтобы сделать это, и читал о SetWindowsPos на C / C ++ / C #, и похоже, что это сделало бы это для меня.Однако, прежде чем переписать свою программу, я хочу знать, позволит ли это мне сохранить мою программу поверх другого полноэкранного приложения.Спасибо

1 Ответ

1 голос
/ 22 февраля 2012

Краткий ответ: Не совсем, нет.

Более длинный ответ: «полноэкранное» приложение использует отображение не так, как обычное приложение с графическим интерфейсом Windows. Как именно они работают, зависит от приложения и ОС; большинство из них будут использовать API-интерфейсы DirectX или OpenGL, которые позволяют приложениям напрямую манипулировать памятью, представляющей экран, а также получать доступ к ускоренным возможностям графического процессора. Эти приложения поддерживаются за счет создания «окна» графического интерфейса пользователя (больше похожего на панель), которое покрывает весь основной экран и «всегда находится сверху», предотвращая когда-либо элементы рабочего стола, которые будут окрашены, поскольку они всегда находятся за полноэкранным режимом. Окно приложения в Z-порядке. Затем приложение получает «свободный» доступ к памяти, представляющей прямоугольник отображения этого окна графического интерфейса, так что оно может манипулировать отдельными пикселями без необходимости использовать цикл сообщений для перекраски этой области.

В этой ситуации дисплей окрашивается, когда хочет приложение (что практически всегда либо «как можно быстрее», либо «синхронизируется со следующим сканированием монитора»), НЕ, когда графический интерфейс Windows считает, что это хорошее время. Итак, все, что нарисовано, когда Windows думает, что это хорошая идея, будет мерцать; Windows рисует ваше окно «всегда сверху» поверх «окна» приложения в Z-порядке графического интерфейса пользователя, затем приложение рисует поверх окна, рисуя прямо на его прямоугольнике. Это приводит к тому, что Windows делает недействительным и перерисовывает ваше окно, и цикл продолжается.

Решение состоит не только в том, чтобы сделать окно «всегда наверху», но и как-то программно «переключить задачу» с окна полноэкранного приложения на ваше. Это может потребовать, чтобы у вашего приложения были привилегии, которые большинство управляемых сред выполнения не могут или не будут предоставлять. Если это возможно, то когда это произойдет, полноэкранное приложение сведется к минимуму (что может или не может быть ОГРОМНОЙ проблемой для ваших пользователей; что бы ни пыталось сказать ваше приложение, оно почти наверняка НЕ ​​будет стоить сворачивать мой сеанс StarCraft 2). в середине рукопашного боя).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...