c++ - 以编程方式确定给定 processid 的应用程序状态

标签 c++ winapi

我正在使用 Enumprocesses( lpidProcess, cb, lpcbNeeded ) 来确定正在运行的 ProcessId。如何子集此列表以仅包含“应用程序”,即显示在“任务管理器应用程序”选项卡上的那些进程?

提前致谢。

最佳答案

根据 How does Task Manager categorize processes as App, Background Process, or Windows Process?在 MSDN 上:

If the process has a visible window, then Task Manager calls it an "App".

If the process is marked as critical, then Task Manager calls it a "Windows Process".

Otherwise, Task Manager calls it a "Background Process".

因此,给定一个进程 ID,您可以通过调用 EnumWindows() 检查它是否有任何可见的窗口,其中回调函数调用 GetWindowThreadProcessId() 来检查是否每个窗口都属于进程,IsWindowVisible() 检查每个窗口是否可见。

例如:

struct myFindInfo
{
    DWORD processID;
    bool found;
};

static BOOL CALLBACK findVisibleWindowProc(HWND hwnd, LPARAM lParam)
{
    myFindInfo *fi = reinterpret_cast<myFindInfo*>(lParam);
    DWORD pid;
    GetWindowThreadProcessId(hwnd, &pid);
    if ((pid == fi->processID) && IsWindowVisible(hwnd))
    {
        fi->found = true;
        return FALSE;
    }
    return TRUE;
}

bool isApplicationProcess(DWORD processID)
{
    findInfo fi;
    fi.processID = processID;
    fi.found = false;
    EnumWindows(&findVisibleWindowProc, reinterpret_cast<LPARAM>(&fi));
    return fi.found;
}

关于c++ - 以编程方式确定给定 processid 的应用程序状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53547233/

相关文章:

C++ 项目结构

c++ - 变量在循环中显示但不在循环中

c++ - Windows 10 相机框架服务器,使用网络摄像头识别实际应用程序

c++ - 向给定 remote_endpoint 对象和套接字的客户端发送数据包?

c++ - 如何使用类的模板参数作为类成员的模板参数?

c++ - 同一用户定义类型的 STL 集和映射

c++ - 在没有 GUI 设计器的情况下实现 GUI 的最佳方法是什么?

c# - 隐藏扫描仪进度条窗口

c - 自定义查找/替换对话框

C++ Win32 不检索编辑数据,即使编辑在范围内