這是一個使用隱藏窗口來偵聽taskkill.exe發送的WM_CLOSE
消息的示例。
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)
demo.bat
@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%
輸出
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
在Windows 8/10任務管理器不考慮這個隱藏窗口屬於一個交互式應用程序,並沒有在其「應用程序」列表中列出進程,因此與taskkill.exe不同,它會強制終止該進程而不是發佈WM_CLOSE
。可能有其他方法可以強制任務管理器將流程歸類爲「應用程序」。
通常您會創建一個可以使用services.msc啓動和停止的服務,或者從命令行使用sc.exe或net.exe創建一個服務。 PyWin32擁有您實施服務所需的一切。它帶有基本的示例代碼,網絡上有很多示例。 – eryksun