如何检查正在运行的进程是不是是后台进程? [关闭]

Posted

技术标签:

【中文标题】如何检查正在运行的进程是不是是后台进程? [关闭]【英文标题】:How do I check if a running process is a background process? [closed]如何检查正在运行的进程是否是后台进程? [关闭] 【发布时间】:2016-06-19 05:03:45 【问题描述】:

我目前正在获取我所有计算机正在运行的进程

Process[] plist = Process.GetProcesses();

有什么好方法可以检查列表中哪些进程作为后台进程运行?

“后台进程”是指用户不可见的进程。我尝试使用 WindowHandler 来检查它的位置,但这并没有完全做到,因为 Windows 中的进程可以在后台运行,并将 WindowHandler 设置为正整数。

【问题讨论】:

你认为什么是后台进程?和任务管理器下的列表一样吗? 在“后台”运行的进程,无需用户输入且屏幕上没有窗口。所以,是的,一个当前正在运行但不可见的进程。 “屏幕上没有窗口”所以,最小化计数? 不,最小化的窗口仍在 Windows 前台运行。我想我可以说“没有窗户”。 :) 守护进程和服务是两个很好的例子。 【参考方案1】:

检查窗口样式似乎可以解决问题:

public static bool hasWindowStyle(Process p)

    IntPtr hnd = p.MainWindowHandle;
    UInt32 WS_DISABLED = 0x8000000;
    int GWL_STYLE = -16;
    bool visible = false;
    if (hnd != IntPtr.Zero)
    
        UInt32 style = GetWindowLong(hnd, GWL_STYLE);
        visible = ((style & WS_DISABLED) != WS_DISABLED);
    
    return visible;

如果满足以下条件,则返回 true:

进程没有用于用户输入的窗口样式

我已经做了一些测试,至少到目前为止,这似乎可以很好地过滤掉幕后运行的进程。

我猜这仅适用于 Windows。

【讨论】:

是的,你是not only allowed but encouraged 来回答你自己的问题! (我已经从你的回答中删除了那句话。) 啊,很高兴知道!谢谢你:) 要编写与 32 位和 64 位版本的 Windows 兼容的代码,请使用 GetWindowLongPtr 而不是 GetWindowLong。

以上是关于如何检查正在运行的进程是不是是后台进程? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何保证 docker 后台进程重启,而不引起容器关闭

如何保证 docker 后台进程重启,而不引起容器关闭

如何保证 docker 后台进程重启,而不引起容器关闭

webstorm如何关闭后台进程

如何使用 C++ 检查进程是不是正在运行

linux 如何后台运行