【问题标题】:WinAPI check if a window has a regular title barWinAPI 检查窗口是否有常规标题栏
【发布时间】:2019-03-19 07:48:29
【问题描述】:

我希望我的程序能够可靠地确定一个窗口(给定它的句柄)是否具有常规的 Windows 样式标题栏(如 Windows 资源管理器、控制面板和大多数桌面应用程序)或自定义标题栏(谷歌浏览器、Visual Studio、 Spotify,存储应用程序)。

GWL_STYLEGWL_EXSTYLE中是否有特定的标志,或者有其他方法可以检查标题栏样式?

【问题讨论】:

  • 有 WS_CAPTION 标志是 windows 样式位的一部分(由 GWL_STYLE 支持)),但这不会告诉您窗口是否执行自定义的非客户端操作。我怀疑有什么方法可以可靠地知道一个窗口有一个纯粹的标准标题栏(但很容易知道没有)。
  • 是的,例如,Visual Studio 2017 设置了WS_CAPTION 标志,它看起来仍然与其他窗口不同。
  • 可能并不容易。没有样式会表明这一点。阅读具有这种标题栏的程序的源代码,了解他们是如何做到的
  • 您需要这些信息做什么?对我来说闻起来像是 XY 问题。
  • 您是否会考虑一个程序,它绘制自己的标题栏,看起来与 Windows 的标题栏一模一样,一个普通的标题栏?如果是,那么您能够做到的唯一方法是从另一个窗口中读取像素并实施一种方法来确定它们是否确实看起来像一个;-)

标签: c++ winapi titlebar


【解决方案1】:

您必须定义您认为“常规”的内容,因此定义什么是“自定义”。

例如,如果我没记错的话,典型的应用程序将设置 WS_CAPTIONWS_BORDER。如果您认为这是“正常的”,那么很容易将其他所有内容视为自定义,然后您就完成了。

要确定您的标准,我建议您检查您提到的应用程序和其他应用程序,最后确定您需要的一组条件。

更多信息:

【讨论】:

  • 样式不会告诉您任何信息,因为程序会绘制自己的非客户区,因此样式会被忽略。
  • @DavidHeffernan 确实如此。尽管它是您无需调试其他进程或尝试读取标题栏的像素并查看它们是否遵循标准样式等黑客行为即可获得的唯一近似值。
  • 是的,但它根本不起作用,所以它完全没用。此外,用户说,“我不知道要检查哪种样式”,而您回答:“尝试找出要检查的样式”。
  • @DavidHeffernan 不确定你的意思。它确实已经过滤掉了许多程序。然后,对于那些没有被过滤的,也许你可以使用一个你保持更新的黑名单,可能是用户。这完全取决于 OP 想要做什么。但这应该是第一个过滤器,按照我的看法。
猜你喜欢
  • 2019-08-27
  • 2011-05-01
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
相关资源
最近更新 更多