Как заставить окно 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
функция была вызвана на это. Увы, я не смог найти способ легко передать текущую позицию окна (x, y) в функцию. Я смог найти обходной путь, но предположил, что не должен вводить новую тему в этот вопрос.
0, 0,
предполагается указать новую ширину и высоту окна в пикселях. Ну, эта функциональность уже в вашемpygame.display.set_mode()
функция, поэтому я оставил их в 0.0x0001
игнорирует эти параметры.
0x0001
соответствует SWP_NOSIZE и является моим единственным uFlag. Список всех доступных uFlags находится на предоставленной странице документации. Вот некоторые из их представлений Hex:
Так и должно быть! Надеюсь, это работает для вас!
Благодарим Джона Поппвелла по адресу [email protected] за помощь.