Как узнать цвет приложения, в котором работает моё приложение?

Я разработал приложение на PyQt5, представляющее собой часы с режимом AlwaysOnTop, в котором отключены фон, меню, заголовок и кнопки, в результате чего окно выглядит следующим образом: <br/> <br/> У меня возник вопрос: как можно определить цвет фона рабочего окна, под которым находится мое приложение? Это необходимо для обеспечения контрастности текста: на черном фоне текст должен быть белым, на других фонах – другого цвета. Возможно ли это реализовать, например, с использованием win32api?
  • 19 ноября 2024 г. 20:33
Ответы на вопрос 2
Да, вы можете использовать библиотеки Python для работы с низкоуровневыми функциями системы Windows, такими как `win32api`, чтобы получить цвет фона окна под вашим приложением. Ниже приведен пример того, как это можно сделать.

Для начала, убедитесь, что у вас установлена библиотека `pywin32`. Если она еще не установлена, вы можете установить её с помощью pip:

```bash
pip install pywin32
```

Затем можно использовать следующий код, который определяет цвет пикселя под вашим окном:

```python
import sys
import win32gui
import win32api
import win32con
from PyQt5 import QtWidgets, QtGui

class ClockWindow(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint | QtCore.Qt.FramelessWindowHint)
        self.setGeometry(100, 100, 300, 100)
        
        self.label = QtWidgets.QLabel("12:00", self)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setStyleSheet("font-size: 30px;")
        
        self.update_text_color()

    def update_text_color(self):
        hwnd = win32gui.GetForegroundWindow()  # Получаем дескриптор верхнего окна
        x, y, _, _ = win32gui.GetWindowRect(hwnd)  # Получаем координаты верхнего окна

        # Получаем цвет пикселя под вашим приложением
        hdc = win32gui.GetDC(hwnd)
        pixel_color = win32gui.GetPixel(hdc, x + 1, y + 1)  # Пиксель немного смещен, чтобы его не затирала рамка
        win32gui.ReleaseDC(hwnd, hdc)

        # Преобразование цвета из формата БГР в RGB
        b = pixel_color & 0xff
        g = (pixel_color >> 8) & 0xff
        r = (pixel_color >> 16) & 0xff

        # Установка цвета текста в зависимости от фона
        brightness = (r + g + b) / 3
        if brightness < 128:
            self.label.setStyleSheet("color: white; font-size: 30px;")
        else:
            self.label.setStyleSheet("color: black; font-size: 30px;")

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    clock = ClockWindow()
    clock.show()
    sys.exit(app.exec_())
```

Обратите внимание на следующее:

1. Код получает дескриптор текущего верхнего окна с `GetForegroundWindow()`.
2. Затем извлекается цвет пикселя из этого окна при помощи `GetPixel()`.
3. На основе яркости извлеченного цвета определяется, какой цвет текста использовать (черный или белый).

Не забудьте проверить, чтобы координаты pikselа были корректны, и возможно, сместить их на несколько пикселей, так как иногда границы окна могут перекрывать нужный пиксель.

Запустите это приложение, чтобы увидеть, как оно меняет цвет текста в зависимости от фона, под которым находится.
Код: 

Похожие вопросы