Python 检测 运行 应用程序的事件侦听器?

Python event listener to detect running applications?

我想 运行 一个 python 脚本在后台运行很长一段时间。基本上,我正在尝试制作一个生产力脚本,它将在程序 运行ning 时强制关闭分散注意力的应用程序。因此,例如,用户输入 30 分钟,在接下来的 30 分钟内,程序将 运行,并强制关闭诸如 Steam 或 Google Chrome.

之类的东西

目前,我使用带有守护线程的 while 循环工作,不断检查 运行ning 应用程序并在需要时关闭一个应用程序:

while True:
    p_tasklist = subprocess.Popen('tasklist.exe /fo csv',
                                  stdout=subprocess.PIPE,
                                  universal_newlines=True)

    for p in csv.DictReader(p_tasklist.stdout):
        if p['Image Name'] == 'myProgram.exe':
            os.system('taskkill /im myProgram.exe')

但显然这是非常 CPU 密集的(一个 CPU 核心是 100%),我试图以某种方式设置一个事件监听器来监听要打开的新程序,但到目前为止一直没有成功。

我试图按照这项工作的思路做一些事情:

while True
    # listen for new program to be opened then run next block
        if program == program_to_close:
            close program

编辑: 为了防止人们过早地结束我的脚本,我需要尽快关闭不需要的程序。否则,脚本可以通过任务管理器结束,对于那些没有自制力的人来说,整个事情毫无意义。

编辑2: 任务管理器是我希望强制关闭的程序之一,而不是 Steam。我不是要制造恶意软件或禁用某人的计算机,如果他们绝对需要退出,他们可以重新启动计算机。

您目前不断地执行外部应用程序,这会占用大量资源。 import sleep from time 并将 sleep(1) 或 sleep(5) 放入 while 循环中。这将减少您的 cpu 使用率。

类似于:

from time import sleep
...your imports...

while True:
    p_tasklist........
    if matches your criteria:
        close program
    sleep(number_of_seconds)

好的,为了帮助可能遇到这个问题的任何人,我根据 abarnert 的建议使用 wmi 侦听器让它工作:

import os
import pythoncom
from threading import Thread
import time
import wmi

def listener():
    pythoncom.CoInitialize()
    c = wmi.WMI()
    process_watcher = c.Win32_Process.watch_for("creation")
    while True:
        new_process = process_watcher()
        if new_process.Caption == 'myApplication.exe':
            os.system('taskkill /im myApplication.exe')


active_time = int(input('How long would you like to block programs for?'))

t = Thread(target=listener)
t.daemon = True
t.start()

time.sleep(active_time)

这 CPU 的使用率下降到只有几个百分点,而且效果一样好。