假设我在WinSta0中创build了两个桌面D1和D2,而D2有一个窗口B.
我的问题是:
属于D1的线程是否可以通过GetWindowText(hwnd for B,….)获得窗口B的标题文本?
层次结构是Session => Window Station => Desktop => Thread =>窗口。 在使用服务时,会话很重要,它们运行在隔离的会话0中。每个会话都至少有WinSta0作为交互式窗口站。 会话0有更多的服务。
一个窗口工作站有多个桌面,至少是您通常使用的默认桌面以及Winlogon桌面,这是一个用于登录和屏幕保护程序的安全桌面。 再加上你创建的,比如你的D2桌面。
桌面上有一个桌面堆,其中存储窗口对象。 每个HWND在堆中都是唯一的。 您将需要GetThreadDesktop()跳回层次结构,并从已知线程返回到创建窗口的桌面。 EnumDesktopWindows()获取该桌面拥有的顶层窗口。
获取线程ID通常是一个障碍,您至少需要了解一些有关该过程的信息。 您可以使用CreateToolhelp32Snapshot()来枚举该进程拥有的线程。
这让你桌面处理。 但GetWindowText只能使用D1句柄,您需要调用SetThreadDesktop()切换到D2。
EnumWindowStations()
EnumDesktops()
– 需要一个Window Station EnumDesktopWindows()
– 需要一个桌面 (和)
EnumWindows()
EnumChildWindows()
– 需要一个父窗口 使用上面的功能,做一个测试,看看它们是否是唯一的。 我会说他们应该。
PS :更多。
HWND在台式电脑中是独一无二的。
tagWND结构(别名HWND)的第一个成员是_THRDESKHEAD结构
typedef struct tagWND { /*0x000*/ struct _THRDESKHEAD head; /*0x014*/ ..............
(来自win32k!tagWND符号)
typedef struct _THRDESKHEAD { THROBJHEAD; PDESKTOP rpdesk; //DESKTOP OBJECT PVOID pSelf; } THRDESKHEAD, *PTHRDESKHEAD;
(来自ReactOS源)
所以每个HWND都被分配到桌面边界。