Как заставить окно 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 находится на предоставленной странице документации. Вот некоторые из их шестнадцатеричных представлений:
Так и должно быть! Надеюсь, это работает для вас!
Благодарим Джона Поппвелла по адресу [email protected] за помощь.