win32api.setConsoleCtrlHandler()を使用すると、Windowsからシャットダウン/ログオフ/ etcイベントを受け取り、アプリケーションを正常にシャットダウンできます。Python - Windowsのシャットダウンイベント
ただし、これはpython.exe(コンソールウィンドウがある)ではなく、pythonw.exe(コンソールウィンドウなし)ではなく、アプリケーションを実行しているときのみ機能します。
これらのイベントを受信するWindowsと同等の方法は、コンソールがなく、受信するウィンドウがない場合ですか?または、コンソールウィンドウを非表示にするプログラム的な方法はありますか?
私の目標は、コンソールウィンドウを表示することなく、Windowsのシャットダウン/ログオフ/ etcイベントを正常に受信できるようにすることです。
編集: 私は周りを遊んでいましたが、かなり進んでいます。私はこれのためのテストコードを書いた。 「taskkill/im pythonw.exe」を実行すると、メッセージが表示されます。
ただし、Windowsでシャットダウン、再起動、またはログオフすると、メッセージは表示されません。
はここで全部です:
""" Testing Windows shutdown events """
import win32con
import win32api
import win32gui
import sys
import time
#import os
def log_info(msg):
""" Prints """
print msg
f = open("c:\\test.log", "a")
f.write(msg + "\n")
f.close()
def wndproc(hwnd, msg, wparam, lparam):
log_info("wndproc: %s" % msg)
if __name__ == "__main__":
log_info("*** STARTING ***")
hinst = win32api.GetModuleHandle(None)
wndclass = win32gui.WNDCLASS()
wndclass.hInstance = hinst
wndclass.lpszClassName = "testWindowClass"
messageMap = { win32con.WM_QUERYENDSESSION : wndproc,
win32con.WM_ENDSESSION : wndproc,
win32con.WM_QUIT : wndproc,
win32con.WM_DESTROY : wndproc,
win32con.WM_CLOSE : wndproc }
wndclass.lpfnWndProc = messageMap
try:
myWindowClass = win32gui.RegisterClass(wndclass)
hwnd = win32gui.CreateWindowEx(win32con.WS_EX_LEFT,
myWindowClass,
"testMsgWindow",
0,
0,
0,
win32con.CW_USEDEFAULT,
win32con.CW_USEDEFAULT,
win32con.HWND_MESSAGE,
0,
hinst,
None)
except Exception, e:
log_info("Exception: %s" % str(e))
if hwnd is None:
log_info("hwnd is none!")
else:
log_info("hwnd: %s" % hwnd)
while True:
win32gui.PumpWaitingMessages()
time.sleep(1)
私はここにかなり近いんだような気がしますが、私は間違いなく何かが足りないんです!
これを実行する方法...私は提供されたscriptを実行しようとしましたが、それは蟻のシステムLogogg、シャットダウンイベントを返さないか、またはタスクマネージャからタスクをkillしても – Rao