Сделать скриншот экрана из сервиса 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 или нет.