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

时间:2013-08-10 05:01:49

标签: windows security winapi gdi handle

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

我的问题是:

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

3 个答案:

答案 0 :(得分:5)

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

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

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

获取线程ID通常会成为一个障碍,您至少需要了解一下该过程。您可以使用CreateToolhelp32Snapshot()从中枚举该进程拥有的线程。

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

答案 1 :(得分:4)

  1. EnumWindowStations()
  2. EnumDesktops() - 需要一个Window Station
  3. EnumDesktopWindows() - 需要桌面
  4. (和)

    1. EnumWindows()
    2. EnumChildWindows() - 需要父窗口
    3. 使用上述功能,进行测试,看看它们是否是唯一的。我会说它们应该是。

      PS :更多here

答案 2 :(得分:4)

HWND在桌面设备中是独一无二的。

tagWND 结构的第一个成员(别名HWND)是 _THRDESKHEAD struct

typedef struct tagWND
    {
    /*0x000*/     struct _THRDESKHEAD head;
        /*0x014*/     ..............

(来自win32k!tagWND符号)

typedef struct _THRDESKHEAD
{
   THROBJHEAD;
   PDESKTOP    rpdesk; //DESKTOP OBJECT
   PVOID       pSelf;   
} THRDESKHEAD, *PTHRDESKHEAD;

(来自ReactOS来源)

因此每个HWND都分配给桌面边界。