如何获得给定流程的窗口站?

c00*_*0fd 2 c c++ windows winapi

比方说,如果我有进程ID或其句柄,我可以获得进程运行的窗口站吗?

Rem*_*eau 6

不是直截了当,但试试这个:

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

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

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

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

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

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

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

  3. 打电话ReadProcessMemory()来阅读PEB.它的ProcessParams.DesktopName字段包含当前与进程关联的工作站/桌面的名称(PEB.ProcessParams当时MSDN显示的字段还有很多).

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

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