2009-12-20 5 views
0

Я играю с JFrame на Java. Я хочу, чтобы это было самое верхнее окно, то есть всегда сверху. SetAlwaysOnTop() отлично работает, но как только я запускаю фильм или игровое окно в полноэкранном режиме, он не может оставаться на вершине.TOPMOST окно в полноэкранном режиме

Я играл с JNI и ручками. Мой код C для JNI использует SetWindowPos(), и кажется, что он работает нормально, пока я не запустил полноэкранное приложение. Вот пример:

JNIEXPORT void JNICALL Java_Frame1_setWindowAlwaysOnTop 
(JNIEnv *env, jclass obj, jint hwnd, jboolean flag) 
{ 
    if (flag) 
    SetWindowPos((HWND) hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); 
    else 
    SetWindowPos((HWND) hwnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); 
    return; 
} 

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

Может ли кто-нибудь предложить обходной путь? КСТАТИ. мой C не так уж близок, так что легко.

Спасибо! Дамо

ответ

1

«Topmost» имеет смысл только в оконном среде.

Полноэкранные игры и фильмы обычно включают режим в полноэкранный режим. Это означает, что одно приложение имеет довольно большой контроль над видео - оно может изменять разрешение, быть единственным отображаемым приложением и т. Д.

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

+0

Боюсь, что вы правы. http://java.sun.com/docs/books/tutorial/extra/fullscreen/exclusivemode.html Спасибо! –

1

«Как создать окно, которое никогда не будет закрыто никакими другими окнами, даже другими верхними окнами?»

Представьте себе, возможно ли это, и представьте, сделали ли это две программы. Программа A создает окно, которое является «супер-самым верхним», а также программа B. Теперь пользователь перетаскивает два окна, чтобы они перекрывались. Что происходит? Вы создали себе логическую невозможность. Один из этих двух окон должны быть выше других, что противоречит мнимой «супер-верхней» особенности

От: http://blogs.msdn.com/oldnewthing/archive/2005/06/07/426294.aspx :)

+0

Очень хорошая точка! Но то, что мне нужно, - это не «супер-верхняя» функция, а однократное переопределение верхнего уровня. Например, окно игры начинается в полноэкранном режиме. Я хочу, чтобы мой код обнаружил событие и отменил верхнюю часть полноэкранного окна. Но если тогда игровое окно снова освежает и становится самым верхним - все в порядке. Что я имею в виду, я не уверен, что есть способ сделать это. Я, конечно, не хочу, чтобы 2 окна были супер-окнами, а просто чтобы временно переопределить f-экран. Кстати, это не так, как при запуске SetWindowPos() в окне 1, а затем на другом? –