ここでは、隠されたウィンドウを使用してtaskkill.exeによって送信されたWM_CLOSE
メッセージをリッスンする例を示します。 Windowsの8/10のタスクマネージャにはない
demo.py
import win32con
import win32gui
def shutdown_monitor():
def wndproc(hwnd, msg, wparam, lparam):
if msg == win32con.WM_CLOSE:
win32gui.DestroyWindow(hwnd)
return 0
elif msg == win32con.WM_DESTROY:
win32gui.PostQuitMessage(0)
return 0
return win32gui.DefWindowProc(hwnd, msg, wparam, lparam)
wc = win32gui.WNDCLASS()
wc.lpszClassName = 'SpamMessages'
wc.lpfnWndProc = wndproc
win32gui.RegisterClass(wc)
hwnd = win32gui.CreateWindow('SpamMessages', 'Python Spam App',
0, 0, 0, 0, 0, 0, 0, 0, None)
win32gui.PumpMessages()
if __name__ == '__main__':
import sys
import time
import atexit
import threading
atexit.register(print, 'PYTHON SPAM APP: SHUTDOWN')
shutdown_thread = threading.Thread(target=shutdown_monitor)
shutdown_thread.start()
shutdown_thread.join()
time.sleep(1)
sys.exit(0x2A)
@echo off setlocal set killquit=taskkill /fi "windowtitle eq Python Spam App" set killkill=taskkill /f /fi "windowtitle eq Python Spam App" echo Quit Test start /b cmd /c "(timeout 3 >nul) & %killquit%" & demo.py echo ExitCode=%=ExitCode% echo. echo Kill Test start /b cmd /c "(timeout 3 >nul) & %killkill%" & demo.py echo ExitCode=%=ExitCode%
demo.bat出力
Quit Test
SUCCESS: Sent termination signal to the process with PID 5612.
PYTHON SPAM APP: SHUTDOWN
ExitCode=0000002A
Kill Test
SUCCESS: The process with PID 5432 has been terminated.
ExitCode=00000001
この非表示ウィンドウを対話型アプリケーションに属するものと見なし、そのプロセスを「Apps」リストにリストしないので、taskkill.exeとは異なり、強制的にWM_CLOSE
の代わりにプロセスを終了します。タスクマネージャにプロセスを「アプリ」として分類させる他の方法もあります。
一般的に、services.mscを使用するか、コマンドラインからsc.exeまたはnet.exeを使用して起動および停止できるサービスを作成します。 PyWin32には、サービスを実装するために必要なものすべてがあります。これには基本的なサンプルコードが付属しており、ウェブ上には多くの例があります。 – eryksun