Python中如何在Windows下判断一个进程是否为前台进程?

如题 想用 python 判断一个进程是前台进程还是后台进程但是不知道怎么做 求各位大佬给个思路


Python中如何在Windows下判断一个进程是否为前台进程?
12 回复

不要问 X/Y 问题,从本来的问题开始问,并告诉我们你是如何想到需要判断进程是不是“前台”的。


在Windows下判断一个进程是否为前台进程,可以通过ctypes调用Win32 API来实现。核心是使用GetForegroundWindow获取前台窗口句柄,再通过GetWindowThreadProcessId获取该窗口对应的进程ID,最后与目标进程ID进行比较。

import ctypes
from ctypes import wintypes

# 导入必要的Win32 API函数
user32 = ctypes.windll.user32

# 函数声明
user32.GetForegroundWindow.restype = wintypes.HWND
user32.GetWindowThreadProcessId.argtypes = [wintypes.HWND, ctypes.POINTER(wintypes.DWORD)]
user32.GetWindowThreadProcessId.restype = wintypes.DWORD

def is_process_foreground(pid):
    """
    判断指定进程ID的进程是否为前台进程
    :param pid: 目标进程ID
    :return: True如果是前台进程,否则False
    """
    # 获取前台窗口句柄
    hwnd = user32.GetForegroundWindow()
    if not hwnd:
        return False
    
    # 获取该窗口对应的进程ID
    foreground_pid = wintypes.DWORD()
    user32.GetWindowThreadProcessId(hwnd, ctypes.byref(foreground_pid))
    
    return pid == foreground_pid.value

# 使用示例
if __name__ == "__main__":
    # 这里用记事本的进程ID举例,实际使用时需要先获取目标进程ID
    notepad_pid = 1234  # 替换为实际进程ID
    print(f"进程 {notepad_pid} 是前台进程吗? {is_process_foreground(notepad_pid)}")

代码说明:

  1. GetForegroundWindow() 返回当前前台窗口的句柄
  2. GetWindowThreadProcessId() 根据窗口句柄获取对应的进程ID
  3. 比较获取的进程ID与目标进程ID是否一致

注意: 需要先获取目标进程的ID(比如通过psutil库或任务管理器),然后传入这个函数进行判断。

一句话总结:用Win32 API获取前台窗口对应的进程ID进行比较。

我写了一个脚本会定时弹窗 但是不希望我打开某些应用时也弹窗 虽然可以通过遍历所有的进程来查看对应的进程是否存在 但是我觉得每次遍历所有的进程实在是太麻烦了 所以我就想到能不能根据进程是否为前台进程来减少遍历的次数呢

我觉得遍历所有进程没什么问题,为什么说太麻烦?

#2 听起来你的“坏方案”是:遍历所有进程,查看它是否符合条件。

“好方案”是:遍历所有“前台进程”,查看它是否符合条件。

然而你似乎没有提出如何取出所有的“前台进程”,你的问题的答案(如果存在)只能帮你如此提取前台进程:遍历所有进程,并丢掉不是“前台”的。如果你的“条件”不是很复杂,是否过滤“前台”似乎没有什么改善。

Windows 自己并不记录一个进程是不是“前台”(你可以发现我一直给“前台”打引号,因为这不是 Windows 固有的概念,是 app 自己想象的概念),所以过滤是否“前台”总是要查看进程的。如果你是根据进程名字过滤,那么你大可不必考虑这么复杂的事情。

因为实际使用时前台的进程的数量常常比后台进程的数量要少得多 所以如果能只遍历前台进程的话就能大大减少遍历的次数 虽然对现在的计算机的性能来说减少的这几次遍历并不算什么 但是我还是希望能够采取一种更高效的遍历方式 同时加深自己的 windows 进程的理解 这也算是一种对自己编程能力的提升吧


> Windows 自己并不记录一个进程是不是“前台”

真的是一语惊醒梦中人啊 感谢 我懂了 看样子是我的牛角尖钻错位置了

Windows 提供获取当前活跃窗口的 API,能获取 PID。或者你调用 Windows API 枚举所有带窗口的进程…

嗯 刚刚看完 geelaw 大佬的回复我就想到了 所谓 windows 下的“前台进程”其实就是带窗口的进程而已…

我不是 win 软件开发者, [不是杠] 好奇一下楼主是怎么定义 win 下面 [前台进程] 的?对 win 开发不熟悉
线程优先级判断? UMS 判断?
比如我一个软件,我大量运算在后台,但是我会在屏幕上有个 1px 的像素表示运算结果(或者有个无关紧要的程序),这算是前台进程吗?
还是 win 有一种规则判断?

你还是要遍历进程,然后获取它们的窗口句柄,再通过句柄查询窗口状态,过滤掉最小化的窗口…

Windows 没有前台进程的概念,你可以尝试遍历进程,也可以遍历窗口来解决你的问题。

回到顶部