层次结构是Session => Window Station => Desktop => Thread => window.当您使用服务时,会话非常重要,它们在隔离会话0中运行.每个会话至少具有WinSta0作为交互式窗口站.会话0还有其他服务.
一个窗口站有多个桌面,至少是您通常与之交互的默认桌面和Winlogon桌面,一个用于登录和屏幕保护程序的安全桌面.还有你创建的其他产品,比如D2桌面.
桌面具有单个桌面堆,其中存储窗口对象.每个HWND在该堆中都是唯一的.您需要GetThreadDesktop()在层次结构中跳回,然后从已知线程返回到创建窗口的桌面.EnumDesktopWindows()获取该桌面拥有的顶级窗口.
获取线程ID通常是一个障碍,您至少需要知道有关该过程的一些信息.您可以使用CreateToolhelp32Snapshot()从中枚举该进程拥有的线程.
这会让你获得桌面处理.但是GetWindowText只能使用D1句柄,你需要调用SetThreadDesktop()来切换到D2.