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)