windows服务桌面交互

用python写windows服务非常多的坑,最后全解决了。最后发现,微软禁止了桌面交互,那搞个锤子。放弃了。老老实实加注册表吧。

# encoding=utf-8

import win32timezone

from logging.handlers import TimedRotatingFileHandler

import win32serviceutil

import win32service

import win32event

import os

import logging

import inspect

import time

import shutil

import servicemanager

import threading

import datetime

import sys

import psutil

import threading

tostop = False

def write(text):

    nowtime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    flname = "D:\\log" + "\\" + "service_log" + nowtime[:10] + ".txt"

    f = open(flname, 'a+')

    if not isinstance(text, str):

        text = str(text)

    f.write(" [" + nowtime + "] \n" + text + "\n")

    f.close()

with open("d:\\userdata\\config\\autorun.ini", "r", encoding="utf-8") as f:

    fl = f.readline()

def main(target):

    processlist = psutil.pids()

    for pid in processlist:

        if psutil.Process(pid).name() == print(os.path.basename(target)):

            print("已经运行,忽略")

        else:

            res = os.system(target)

            # print(res)

            break

def strt(fullpath):

    threading.Thread(name="main", target=main, kwargs={"target": fullpath}, daemon=True).start()

class PythonService(win32serviceutil.ServiceFramework):

    _svc_name_ = "Clearjob2027"  #服务名

    _svc_display_name_ = "Clearjob 2023"  #job在windows services上显示的名字

    _svc_description_ = "Clear system files"  #job的描述

    def __init__(self, args):

        win32serviceutil.ServiceFramework.__init__(self, args)

        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)

        self.logger = self._getLogger()

        self.path = 'D:\\tmp'

        self.T = time.time()

        self.run = True

        global tostop

        tostop = False

    def _getLogger(self):

        '''日志记录'''

        logger = logging.getLogger('[PythonService]')

        this_file = inspect.getfile(inspect.currentframe())

        dirpath = os.path.abspath(os.path.dirname(this_file))

        if os.path.isdir('%s\\log' % dirpath):  #创建log文件夹

            pass

        else:

            os.mkdir('%s\\log' % dirpath)

        dir = '%s\\log' % dirpath

        handler = TimedRotatingFileHandler(os.path.join("D:\\UserData\\log", "Clearjob.log"), when="midnight", interval=1, backupCount=20)

        formatter = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s')

        handler.setFormatter(formatter)

        logger.addHandler(handler)

        logger.setLevel(logging.INFO)

        return logger

    def SvcDoRun(self):

        self.logger.info("service is run....")

        while tostop != True:

            global fl

            strt(fl)

            time.sleep(10)

        # try:

        #     while self.run:

        #         self.logger.info('---Begin---')

        #         while True:

        #             for path, name, file in os.walk('D:\\tmp'):

        #                 with open("D:\\Tmp\\a.txt", "a+", encoding="utf-8") as f:

        #                     f.write("a" + str(1) + "\n")

        #                 import ctypes  # An included library with Python install.

        #                 ctypes.windll.user32.MessageBoxW(0, "Your text", "Your title", 1)

        #             self.logger.info('---End---')

        #             time.sleep(10)

        # except Exception as e:

        #     self.logger.info(e)

        #     time.sleep(60)

    def SvcStop(self):

        self.logger.info("service is stop....")

        global tostop

        tostop = True

        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)

        win32event.SetEvent(self.hWaitStop)

        self.run = False

if __name__ == '__main__':

    if len(sys.argv) == 1:

        servicemanager.Initialize()

        servicemanager.PrepareToHostSingle(PythonService)

        servicemanager.StartServiceCtrlDispatcher()

    else:

        win32serviceutil.HandleCommandLine(PythonService)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值