Windows 在注销、重起、关机之前会向每个当前正在运行的应用程序发送WM_QUERYENDSESSION消息

注意:这里有一点问题,就是如果需要获取关机信息,需要打包成exe测试,直接运行测试无效。

           另外一个就是需要注意的是这里获取的关机信息是WM_QUERYENDSESSION,我第一次写的时候写成了VM,结果就是直接失败了。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/3/1 上午11:44
# @Author  : wangying
# @Site    : 
# @File    : windows关闭消息通知.py
# @Software: PyCharm

import win32com.client
import win32con
import win32gui
import win32timezone

import win32serviceutil
from win32serviceutil import usage, GetServiceClassString, StartService, RestartService, WaitForServiceStatus, \
    LocateSpecificServiceExe, DebugService, InstallService, RemoveService, ChangeServiceConfig

import win32event

import win32timezone  # pyinstaller 打包时没有导入,需要主动导入
import win32service
import win32api
import time

def log_info(msg):
    print(msg)
    f= open('c:\\test.txt','a')
    f.write(str(msg) +"\n")
    f.close()

def wndproc(hwnd,msg,wparam,lparam):
    # 关机时捕获到消息后执行的程序:17是响应WM_QUERYENDSESSION;22是响应WM_ENDSESSION
    log_info("关机时捕获到消息后执行的程序")
    log_info(time.time())
    log_info("wndproc  %s "%msg)
    log_info("wparam  %s "%wparam)
    log_info("lparam  %s "%lparam)
    time.sleep(10)
    return True

if __name__ == '__main__':
    log_info("****** start ******")
    hinst = win32api.GetModuleHandle(None)
    wndclass = win32gui.WNDCLASS()
    wndclass.hInstance = hinst
    wndclass.lpszClassName = "testWindowClass"
    messageMap = {
        # win32con.WM_QUERYENDSESSION:wndproc,
        win32con.WM_ENDSESSION:wndproc,
    }
    wndclass.lpfnWndProc = messageMap
    try:
        myWindowClass = win32gui.RegisterClass(wndclass)
        hwnd = win32gui.CreateWindowEx(
            win32con.WS_EX_LEFT,
            myWindowClass,
            "Testwindows",
            0,
            0,
            0,
            win32con.CW_USEDEFAULT,
            win32con.CW_USEDEFAULT,
            0,
            0,
            hinst,
            None
        )
    except Exception as e:
        log_info(str(e))

    if hwnd is None:
        log_info("hwnd is none")
    else:
        log_info("hwnd else is  "+str(hwnd))

    while True:
        win32gui.PumpWaitingMessages()
        time.sleep(1)


 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐