我正在尝试获取单独的进程仅使用其进程 ID 打开的 winstation 的名称(例如“winsta0”)。我在 MSDN 上找不到任何可以做到这一点的东西。他们似乎只有 GetProcessWindowStation() 仅适用于您自己的进程。
有任何想法吗?
更新:也许这是难题的一部分......
BOOL ProcessIdToSessionId( __in DWORD dwProcessId, __out DWORD *pSessionId );
您可能必须使用 EnumWindowStations()、EnumDesktops()、EnumDesktopWindows() 和 GetWindowThreadProcessId() 来查看所有正在运行的窗口,直到找到与所需进程 ID 匹配的窗口。
好吧,我查看了 API 函数,但遇到了和你一样的死胡同。只要目标进程创建一个或多个顶级窗口,Remy 的建议就应该有效。我也想到了以下疯狂的想法:
注入的代码将调用 GetProcessWindowStation(),然后使用 IPC 机制将其发送回您的进程。获取后,使用 VirtualFreeEx() 恢复目标进程的原始地址空间。在其他用户的进程中使用它会产生一些额外的问题,但如果您以管理员身份运行,它应该仍然可以工作。