Как нарисовать уведомление на экране, которое не фокусируется и всегда остается сверху (Windows)

1

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

Предпочтителен Python.

То, на что я нацеливаюсь, - это сделать мой python script отображать уведомление на экране, возможно, только некоторый текст (прозрачный фон), и чтобы он показывался перед тем, что вы делаете в время.

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

  • 0
    Готовы ли вы признать, что это может быть недостижимо?
  • 0
    @David: Давид: Я волновался, что это может быть так ..
Теги:
notifications

2 ответа

1
Лучший ответ

В общем, вы не можете написать приложение, которое гарантирует пребывание поверх других приложений, которые хотят оставаться поверх других приложений.

Поскольку полноэкранное приложение - это окно, которое является самым верхним, ОС не знает, что ваше самое верхнее окно должно быть самым верхним, чем другое самое верхнее окно.

В идеале вы должны найти способ взаимодействия с другим приложением.

Однако вот некоторые трюки, которые вы можете попробовать, которые могут работать в некоторых ситуациях:

  • Вам, вероятно, придется напрямую использовать API Win32.
  • Не активируйте свое окно с помощью SetActive, просто используйте SetWindowPos с SWP_NOACTIVATE и HWND_TOPMOST, чтобы переместить его на передний план без активации.
  • Попробуйте отключить ваше окно, тогда он не сможет украсть фокус, что составляет половину проблемы.
  • Вам может потребоваться установить SPI_SETFOREGROUNDLOCKTIMEOUT в SystemParametersInfo на небольшое значение.
  • Вам может потребоваться повторное использование переднего плана, пока вы его не получите.

Обратите внимание, что эти трюки не помогут, если другое окно делает то же самое.

Полезный документ здесь:

0

Если Qt является опцией, вы можете попробовать использовать атрибут Qt::WA_ShowWithoutActivating, как предлагается в этот вопрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню