HWND在窗口站中是唯一的吗?

xml*_*lmx 3 windows security winapi gdi handle

假设我在WinSta0中创建了两个桌面D1和D2,而D2有一个窗口B.

我的问题是:

属于D1的线程是否可以通过GetWindowText获取窗口B的标题文本(hwnd for B,....)?

Han*_*ant 5

层次结构是Session => Window Station => Desktop => Thread => window.当您使用服务时,会话非常重要,它们在隔离会话0中运行.每个会话至少具有WinSta0作为交互式窗口站.会话0还有其他服务.

一个窗口站有多个桌面,至少是您通常与之交互的默认桌面和Winlogon桌面,一个用于登录和屏幕保护程序的安全桌面.还有你创建的其他产品,比如D2桌面.

桌面具有单个桌面堆,其中存储窗口对象.每个HWND在该堆中都是唯一的.您需要GetThreadDesktop()在层次结构中跳回,然后从已知线程返回到创建窗口的桌面.EnumDesktopWindows()获取该桌面拥有的顶级窗口.

获取线程ID通常是一个障碍,您至少需要知道有关该过程的一些信息.您可以使用CreateToolhelp32Snapshot()从中枚举该进程拥有的线程.

这会让你获得桌面处理.但是GetWindowText只能使用D1句柄,你需要调用SetThreadDesktop()来切换到D2.