【发布时间】:2013-08-10 05:01:49
【问题描述】:
假设我在WinSta0中创建了两个桌面D1和D2,D2有一个窗口B。
我的问题是:
属于D1的线程能否通过GetWindowText(hwnd for B, ....)获取窗口B的标题文字?
【问题讨论】:
标签: windows security winapi gdi handle
假设我在WinSta0中创建了两个桌面D1和D2,D2有一个窗口B。
我的问题是:
属于D1的线程能否通过GetWindowText(hwnd for B, ....)获取窗口B的标题文字?
【问题讨论】:
标签: windows security winapi gdi handle
层次结构是 Session => Window Station => Desktop => Thread => window。当您使用服务时,会话很重要,它们在隔离会话 0 中运行。每个会话至少有 WinSta0 作为交互式窗口站。会话 0 有额外的服务。
一个窗口站有多个桌面,至少是您通常与之交互的默认桌面和 Winlogon 桌面,一个用于登录和屏幕保护程序的安全桌面。加上您创建的其他内容,例如您的 D2 桌面。
桌面有一个单独的桌面堆,用于存储窗口对象。每个 HWND 在该堆中都是唯一的。您将需要 GetThreadDesktop() 跳回层次结构并从已知线程返回到它创建窗口的桌面。 EnumDesktopWindows() 获取该桌面拥有的顶级窗口。
获取线程 ID 通常是一个障碍,您至少需要了解有关该进程的一些信息。您可以从中枚举该进程拥有的线程,例如 CreateToolhelp32Snapshot()。
这将为您提供桌面句柄。但是 GetWindowText 只能使用 D1 句柄,您需要调用 SetThreadDesktop() 才能切换到 D2。
【讨论】:
EnumWindowStations()EnumDesktops() - 需要一个窗口站EnumDesktopWindows() - 需要桌面(和)
EnumWindows()EnumChildWindows() - 需要一个父窗口使用上面的函数,做一个测试,看看它们是否是唯一的。我会说它们应该是。
PS:更多here。
【讨论】:
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 都被分配到桌面边界。
【讨论】: