Как заставить окно Python работать как «Всегда сверху»?

Я запускаю небольшую программу на Python, которая запускает небольшое окно, которое должно оставаться поверх всех других окон. Я считаю, что это зависит от ОС, как это делается в GNU-Linux с GNOME? [

Обновление - решение для Windows]

Прекрасно, я думаю, у меня все получилось. Я использую Python 2.5.4 с Pygame 1.9.1 в Eclipse на Vista, 64-разрядная версия. Таким образом, это для оконных систем.SetWindowPos функция задокументированаВот, Я буду ссылаться на это в моем объяснении.

Импорт:

from ctypes import windll

Затем я установил переменную, которая вызываетSetWindowPos» в user32:

SetWindowPos = windll.user32.SetWindowPos

Теперь давайтескажем, я только что сделал окно:

screen = pygame.display.set_mode((100,100), pygame.NOFRAME)

Следующая строка - это ключ. Это устанавливает окно поверх других окон.

SetWindowPos(pygame.display.get_wm_info()['window'], -1, x, y, 0, 0, 0x0001)

В основном, вы поставляетеhWnd(Дескриптор окна) с идентификатором окна, возвращенным из вызоваdisplay.get_wm_info(), Теперь функция может редактировать только что инициализированное вами окно.

-1 наше .hWndInsertAfter

На сайте MSDN написано:

Окно можно сделать самым верхним, либо установив для параметра hWndInsertAfter значение HWND_TOPMOST и убедившись, что флаг SWP_NOZORDER не установлен, либо установив окно 'Положение в порядке Z, так что оно находится над любыми существующими верхними окнами. Когда не верхнее окно становится верхним, его собственные окна также становятся верхними. Однако его владельцы не изменились.

Итак-1 убедитесь, что окно находится над любыми другими существующими верхними окнами, но это может работать не во всех случаях. Может быть, -2 бьет -1? В настоящее время это работает для меня. :)

x а такжеy указать новые координаты для устанавливаемого окна. Я хотел, чтобы окно оставалось в своем текущем положении, когдаSetWindowPos функция была вызвана на это. Увы, я не могt найти способ легко передать текущую позицию окна (x, y) в функцию. Я смог найти работу, но предположил, что не долженне вводить новую тему в этот вопрос.

0, 0, предполагается указать новую ширину и высоту окна в пикселях. Ну, эта функциональность уже в вашемpygame.display.set_mode() функция, поэтому я оставил их в 0.0x0001 игнорирует эти параметры.

0x0001 соответствует SWP_NOSIZE и является моим единственным uFlag. Список всех доступных uFlags находится на предоставленной странице документации. Вот некоторые из их шестнадцатеричных представлений:

SWP_NOSIZE = 0x0001SWP_NOMOVE = 0x0002SWP_NOZORDER = 0x0004SWP_NOREDRAW = 0x0008SWP_NOACTIVATE = 0x0010SWP_FRAMECHANGED = 0x0020SWP_SHOWWINDOW = 0x0040SWP_HIDEWINDOW = 0x0080SWP_NOCOPYBITS = 0x0100SWP_NOOWNERZORDER = 0x0200SWP_NOSENDCHANGING = 0x0400

Так и должно быть! Надеюсь, это работает для вас!

Благодарим Джона Поппвелла по адресу [email protected] за помощь.

Ответы на вопрос(3)

Ваш ответ на вопрос