Сделать скриншот экрана из сервиса Windows

Пытаюсь сделать сервис, который должен делать скрины, через определенные временные промежутки. Пробовал использовать библиотеки mss, pyscreenshot, Pillow везде результат один, в лучшем случае получаю черный скриншот с размерами не соответствующими не одному установленному экрану. Пробовал добавить в сервис subprocess и запускать через python.exe, script.py - сервис не падает, но скриншотов тоже нет. Сейчас остановился на таком коде:

import socket

import win32serviceutil

import servicemanager
import win32event
import win32service


class SMWinservice(win32serviceutil.ServiceFramework):
    _svc_name_ = 'ScreenShot`er'
    _svc_display_name_ = "Service ScreenShot`er - powered by Python"
    _svc_description_ = 'Сервис для создания скриншотов'

    @classmethod
    def parse_command_line(cls):
        win32serviceutil.HandleCommandLine(cls)

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        socket.setdefaulttimeout(60)

    def SvcStop(self):
        self.stop()
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        self.start()
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_, ''))
        self.main()

    def start(self):
        self.isrunning = True

    def stop(self):
        self.isrunning = False

    def main(self):
        while self.isrunning:
            import time
            from mss import mss

            with mss() as sct:
                sct.shot(output="path\\to\\folder\\my_file.png")
            time.sleep(10)


if __name__ == '__main__':
    SMWinservice.parse_command_line()

При запуске сервис корректно работает делает скрины каждые 10сек., но дает черные скрины в определенной мной директории.

Я пробовал закинуть в сервис код, которым пытался выяснить какие тот видит экраны, используя такой код:

from win32api import EnumDisplayMonitors
all_mon = EnumDisplayMonitors()
print(all_mon)

и вот что я получил:

Результат запуска кода из интерпритатора:

[(<PyHANDLE:65537>, <PyHANDLE:0>, (0, 0, 2560, 1440)), (<PyHANDLE:65539>, <PyHANDLE:0>, (1855, -1080, 3775, 0)), (<PyHANDLE:65541>, <PyHANDLE:0>, (-1920, 172, 0, 1252))]

Результат запуска кода из сервиса:

Нашел мониторы: [(<PyHANDLE:65537>, <PyHANDLE:0>, (0, 0, 1024, 768))]

Логично, что сервис получает черные скриншоты, но не понятно, как то подобный сервис возможно реализовать в рамках python или нет.


Ответы (0 шт):