【问题标题】:How to determine if an process is the currently active / foreground application如何确定一个进程是否是当前活动/前台应用程序
【发布时间】:2009-05-19 18:10:41
【问题描述】:

我希望能够查询某个函数并给它一个 processID 或 processName - 然后它应该返回 truefalse,无论该进程是否在前台。

因此,即 Firefox 的查询将返回 true(因为现在我在 FireFox 中,输入此内容),其他所有内容都应返回 false



这是否适用于每种类型的应用程序(.net、java/swing、纯 c++/win32-ui)?

  • 此问题仅适用于 Windows。

【问题讨论】:

    标签: windows process


    【解决方案1】:

    GetForegroundWindowGetWindowThreadProcessId 应该可以让您获得此信息。

    也就是说,如果您知道 pid,只需对照以下函数检查它:

    bool IsForegroundProcess(DWORD pid)
    {
       HWND hwnd = GetForegroundWindow();
       if (hwnd == NULL) return false;
    
       DWORD foregroundPid;
       if (GetWindowThreadProcessId(hwnd, &foregroundPid) == 0) return false;
    
       return (foregroundPid == pid);
    }
    

    这适用于在某种程度上使用核心 Win32 库的任何应用程序 - 这将包括 Windows 窗体、WPF、本机 Win32 应用程序等。请注意,这仅适用于在调用桌面和会话上运行的应用程序 -例如,您不能使用它来确定其他用户的应用程序是否在前台。

    【讨论】:

    • 谢谢,您知道这是否适用于 DirectX / OpenGL 应用程序吗?
    • 我认为可能。 . . D3D 应用有一个焦点窗口或设备窗口,可以在这里使用。
    • 好的,刚刚试了一下,似乎在 DirectX 应用上也能正常工作。
    • if (GetWindowThreadProcessId(hwnd, &pid) 应为 if (GetWindowThreadProcessId(hwnd, &foregroundPid)。实际上,您正在将未初始化的 DWORD 值与前台窗口的 PID 进行比较。
    猜你喜欢
    • 2013-01-22
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多