c++ - 如何获得给定进程的窗口站?

标签 c++ c windows winapi

比如说,如果我有一个进程 ID 或者它的句柄,我能得到 window station 吗?该进程运行在什么条件下?

最佳答案

不是直接的,但试试这个:

  1. 调用EnumWindowStations()在与调用进程相同的 Session 中枚举可用的窗口站(如果您需要在另一个 Session 中查询进程,那么这将不起作用)。

  2. 对于每个窗口站,请调用 EnumDesktops()枚举其桌面。

  3. 对于每个桌面,请调用 EnumDesktopWindows()枚举其顶级窗口。

  4. 对于每个窗口,调用 GetWindowThreadProcessId()获取其进程 ID 并将其与您要查找的 ID 进行比较。

另一种选择可能是执行以下操作:

  1. 调用OpenProcess()从目标进程 ID 获取 HANDLE

  2. 调用NtQueryInformationProcess()检索进程的地址 PEB结构。

  3. 调用ReadProcessMemory()阅读 PEB。它的 ProcessParams.DesktopName 字段包含当前与该进程相关联的工作站/桌面的名称(PEB.ProcessParams 中还有更多字段可用,然后是 MSDN 显示的内容)。

  4. 解析 DesktopName 以提取窗口站和桌面名称。

  5. 根据需要枚举工作站,从 GetUserObjectInformation() 中寻找匹配名称.

关于c++ - 如何获得给定进程的窗口站?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23144350/

相关文章:

c++ - C/C++ 后递增/递减和函数调用

windows - 当 Pageant 完成加载 SSH key 时运行批处理文件

windows - windows线程溢出时如何查看当前栈大小

c# - 在 linux 中,mono 调用我的 .so lib 返回 System.EntryPointNotFoundException

c++ - 如何使用 CLion 创建 C 项目

c - 如何在 C 中将 unsigned int 转换或转换为 int?

C#:当我尝试移动窗口、单击外部或最小化窗口时,窗口会挂起

c++ - 路径正确但包含未找到

c++ - 为什么我们没有义务实现纯虚析构函数?

c++ - sscanf 从八进制转换 : How does it know?