Интерактивная служба Windows? - PullRequest
0 голосов
/ 28 июня 2018

Я создал службу Windows в Python и попытался получить текущее окно с помощью GetForegroundWindow () из ctypes. Чтобы проверить, заблокирован ли ПК (GetForegroundWindow () == когда ПК заблокирован, работает нормально в обычном скрипте Python)

Очевидно, что Служба должна быть «Интерактивной службой» для распознавания текущего окна.

Итак, вопрос таков: есть ли способ запустить Службу как интерактивную службу?

Служба Windows структурирована следующим образом (я удалил некоторые части кода, поэтому пост не такой длинный):

class Service(win32serviceutil.ServiceFramework):
    _svc_name_ = "Service"
    _svc_display_name_ = "Service"


    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        # Create an event which we will use to wait on.
        # The "service stop" request will set this event.
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)

    def SvcStop(self):
        # Tell ReportServiceStatus we are starting the stop process.
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING, waitHint=10000)

        # And set stop event.
        win32event.SetEvent(self.hWaitStop)

    def GetAcceptedControls(self):

        result = win32serviceutil.ServiceFramework.GetAcceptedControls(self)
        result |= win32service.SERVICE_ACCEPT_PRESHUTDOWN
        return result

    def SvcOtherEx(self, control, event_type, data):

        if control == win32service.SERVICE_CONTROL_PRESHUTDOWN:
            #_log('received a pre-shutdown notification')
            self.SvcStop()

    def SvcDoRun(self):
        user32 = ctypes.windll.User32
        #Do Something 

        while True:
            time.sleep(1)
            print(str(user32.GetForegroundWindow()))

        # Wait until the Service is stopped
        win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)

1 Ответ

0 голосов
/ 28 июня 2018

Есть ли способ запустить Сервис как интерактивную?

Я не рекомендую это делать.

Вы должны создать процесс, который запускается в контексте рабочего стола пользователя. См. CreateProcessAsUser () . Этот процесс может иметь графический интерфейс и взаимодействовать с вашим сервисом.

Я, вопреки всем советам, вы все еще хотите создать интерактивный сервис, прочитайте MSDN в Интерактивных сервисах . Имейте в виду, что в большинстве случаев это подвергает ПК риску безопасности.

...