2012-02-21 2 views
1

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

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

+0

О чем вы «мерцаете»? Я использовал 'setAlwaysOnTop()' без мерцания или проблемы. –

+2

Прежде чем вы перейдете к переписанию своего приложения, рассмотрите это эссе: [Как создать верхнее окно, которое никогда не покрывается другими верхними окнами?] (Http://blogs.msdn.com/b/oldnewthing/ архив/2011/03/10/10138969.aspx) –

+0

Пожалуйста, напишите, почему downvote, люди, пожалуйста? – deadfish

ответ

1

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

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

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

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

+0

keith Спасибо за ответ. Действительно хороший. У меня есть приложение для работы, но, как вы сказали, есть раздражающее переключение между задачами. Если это невозможно сделать, поскольку полноэкранное приложение использует графический процессор и все приоритеты. Есть ли решение, которое хаки и другие вещи используют для использования, управляют активной программой без переключения задачи? –

+1

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

+0

Кейт, ты просто бросаешь знания обо мне. Я заметил, что если я начну пытаться конкурировать за верхнее окно с таким приложением, как игра, частота кадров в игре резко уменьшается. Это связано с тем, что цикл прерывается или мое приложение не дает игре то, что она хочет (чтобы быть сверху)? Ps, когда вы говорите, вероятно, не дает мне надежды на то, что я смогу найти какое-то решение. Я буду продолжать смотреть и посмотреть, что делают некоторые хаки, чтобы оставаться на вершине/манипулировать программой, к которой они привязаны. –