【问题标题】:What's the best way do determine if an HWND represents a top-level window?确定 HWND 是否代表顶级窗口的最佳方法是什么?
【发布时间】:2013-06-03 03:56:22
【问题描述】:

是否检查WS_CHILD位:

    LONG style = GetWindowLong(hwnd, GWL_STYLE);
    int isTopLevel = !(style & WS_CHILD);

或者有没有更好的方法?

假设:直接 C 调用仅现有的 Windows API 代码。

【问题讨论】:

  • 检查WS_CHILD 样式的缺失是一种方法——任何不是子窗口的窗口都是顶级窗口。
  • @Jonathan - 但是,WS_CHILD(DesktopWindow 的子级)有顶级
  • 在窗口层次结构中,所有窗口都是桌面的子窗口,但只有设置了WS_CHILD的窗口才是真正的子窗口。
  • 再一次,如果你不明白:有顶级的WS_CHILD。
  • 反之,窗口可以不是 WS_CHILD 但不是顶级的

标签: c++ c windows winapi


【解决方案1】:
  • 方法一:测试hWnd==GetAncestor(hWnd,GA_ROOT)

  • 方式#2:使用IsTopLevelWindow(user32 Win7,未记录)

【讨论】:

    【解决方案2】:

    GetParent() API 返回当前窗口的父级或所有者。

    【讨论】:

    • 我链接到的文档的第一行说“检索指定窗口的父级或所有者的句柄”。并在文章后面讨论检索所有者窗口。
    • @chris:文档说:“如果窗口是子窗口,则返回值是父窗口的句柄。如果窗口是具有 WS_POPUP 样式的顶级窗口,则返回值是所有者窗口的句柄。"
    • @jwismar,我今天失明了。我阅读了有关GetWindowGetAncestor 的所有内容,但不知何故错过了第一句话。
    • @jwismar,GetParent 完全没用。
    • @kero 你能解释一下原因吗?
    【解决方案3】:

    您的方法是可能的(但我认为您最好检查它是否也是重叠/弹出窗口)。也许还有另一种方法——即枚举所有顶级窗口并检查您的窗口是否包含在结果中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多