ValarMayar
@ValarMayar
Д У Р А Ч О К / недопрограммист графоман

Как открывать и держать окно chromium поверх всех окон?

Доброго времени суток.
Есть у меня проект, написанный на python + eel (что-то типа electron)

eel как и electron js использует chromium для построения интерфейса.

Проблема у меня такая, мне нужно открывать проект, написанный на python + eel поверх всех окон и желательно закреплять так же поверх всех окон

В electron js есть встроенные методы реализации данной фичи:
win.setAlwaysOnTop(true, 'screen')
а в eel, разумеется нет.

Есть ли какие-то способы решения данной задачи?
Меня в принципе устроит любой вариант, манипуляции с хромом, python кодом и тп. Кроме стороннего софта.
  • Вопрос задан
  • 309 просмотров
Решения вопроса 1
ValarMayar
@ValarMayar Автор вопроса
Д У Р А Ч О К / недопрограммист графоман
Решение:
В окружении находим пакет venv/Lib/site-packages/eel/__init__.py
Импортируем нужные для фиксации окна либы, а именно

import win32gui
import win32con, win32com.client
import re


Пишем функцию которая будет при открытии закреплять окно.
def _window_enum_callback(hwnd, wildcard):
    """this simple function make eel window always be on top"""
    if re.match(wildcard, str(win32gui.GetWindowText(hwnd))) is not None:
        win32gui.BringWindowToTop(hwnd)
        shell = win32com.client.Dispatch("WScript.Shell")
        shell.SendKeys('%')
        win32gui.SetForegroundWindow(hwnd)
        win32gui.ShowWindow(hwnd, win32con.HWND_TOPMOST)
       """Получаем размер окна и координаты, что бы оно не меня позицию при вызове функции, а лишь закрепляло"""
        rect = win32gui.GetWindowRect(hwnd) 
        x = rect[0]
        y = rect[1]
        w = rect[2] - x
        h = rect[3] - y
        win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, x, y, w, h, 0)


В стартовые аргументы добавим флаг "onTop"
_start_args = {
    'mode':             'chrome',                   # What browser is used
    'host':             'localhost',                # Hostname use for Bottle server
    'port':             8000,                       # Port used for Bottle server (use 0 for auto)
    'block':            True,                       # Whether start() blocks calling thread
    'jinja_templates':  None,                       # Folder for jinja2 templates
    'cmdline_args':     ['--disable-http-cache'],   # Extra cmdline flags to pass to browser start
    'size':             None,                       # (width, height) of main window
    'position':         None,                       # (left, top) of main window
    'geometry':         {},                         # Dictionary of size/position for all windows
    'close_callback':   None,                       # Callback for when all windows have closed
    'app_mode':  True,                              # (Chrome specific option)
    'all_interfaces': False,                        # Allow bottle server to listen for connections on all interfaces
    'disable_cache': True,                          # Sets the no-store response header when serving assets
    'default_path': 'index.html',                   # The default file to retrieve for the root URL
    'app': btl.default_app(),                       # Allows passing in a custom Bottle instance, e.g. with middleware
    'onTop': False                                   # Set Chrome Window always be on top False/True <----
}


Ниже в функции
def _static(path):
    if _start_args['onTop']: # наша проверка
        win32gui.EnumWindows(_window_enum_callback, ".*%s.*"% 'Adder')


Ну и уже в основном коде при старте окна хрома с помощью eel допишем нужный нам статус
eel.start('index.html', onTop = True)

PS возможно это не идеальное решение, но оно работает.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы