为每个登录用户查找活动应用程序

Posted

技术标签:

【中文标题】为每个登录用户查找活动应用程序【英文标题】:Finding active application for every logged on user 【发布时间】:2020-08-08 13:32:43 【问题描述】:

我需要有关 Windows API 的帮助,我需要实现一个 Windows 应用程序,该应用程序为每个登录的用户记录当前处于焦点(活动)的应用程序,并将该信息记录在 txt 文件中。由于我对 Windows API 不太擅长,有人可以帮助我至少提供一些指导方针如何做到这一点,使用哪些 Windows 操作系统方法等?谢谢

编辑:我很难找到一种方法来查看每个用户关注的应用程序。我使用 LsaEnumerateLogonSessions 来查找所有登录用户的列表,然后使用 LsaGetLogonSessionData 来获取有关用户的信息,但这就是我现在所拥有的一切。

【问题讨论】:

WinEvents. 查看编辑。谢谢 【参考方案1】:

没有 API 可以查询另一个会话中的活动应用。

您必须通过CreateProcessAsUser() 在每个会话中运行一个进程,该进程调用GetForegroundWindow() 以获取会话的活动焦点窗口,然后通过GetWindowText() 查询该窗口以获取信息,例如其标题,或其拥有的EXE文件名通过GetWindowThreadProcessId() + OpenProcess() + GetModuleFileNameEx()等,然后通过您想要的任何可以跨越会话边界(管道,套接字等)的IPC机制将该信息传达回您的主应用程序。

【讨论】:

我正在考虑这个问题,但问题是,我没有其他用户的密码,为了调用 CreatProcessAsUser,我需要使用用户密码调用 LogonUser。没有密码有什么办法吗? 你好@Remy Lebau。我设法使用 WTSEnumerateSessionsA 来获取所有会话,而不是使用 WTSQueryUserToken 将其用于 CreateProcessAsUser。但我不确定如何用它调用 GetForegroundWindow(),因为 CreateProcessAsUser 只接受 exe 文件?你能给我一个小代码示例吗? @MrDejan995 您将不得不制作另一个 EXE 程序来完成获取窗口信息并将其返回的工作。或者你可以只启动你的主 EXE 的第二个副本,给它输入参数告诉它的 WinMain 只做额外的工作然后退出,而不是做它的主代码。【参考方案2】:

以管理员身份运行您的应用程序,调用EnumProcesses 函数枚举系统中(不同用户的)当前进程。

使用GetModuleBaseName 获取进程/应用程序名称。

有关更多详细信息,请参阅Enumerating All Processes。

如果你想检查用户名,请参考这个帖子:C++ Get Username From Process。

【讨论】:

以上是关于为每个登录用户查找活动应用程序的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询查找每个用户的活动时间

在 Shiny 应用程序中跟踪用户活动

查找当前用户活动目录组 C++

Android - 在单个活动应用程序中使用工具栏按钮弹出 Back Stack

查找唯一标识符重复的每个字段的最大序列号

导航抽屉异步任务