【问题标题】:Reliably identifying any window's client area可靠地识别任何窗口的客户区
【发布时间】:2014-07-14 14:24:25
【问题描述】:

我正在开发一个可以复制并扩展 Aero Snap 功能的程序。

Aero Snap 会恢复一个最大化的窗口,如果用户“抓住”它的标题栏,我很难识别这个动作。

给定屏幕坐标中的光标位置,我将如何检查该位置是否在窗口的标题栏中?我对 Win32 API 并不熟悉,也找不到一种在复杂情况下可靠工作的方法,例如:

请注意,chrome 插入到标题栏中的选项卡。 Office 使用快速启动菜单执行类似操作。

【问题讨论】:

  • WM_NCHITTEST 可能就是您想要的。
  • Chrome 和 Office 都使用了DwmExtendFrameIntoClientArea 函数。这确实使事情变得复杂,因为这实际上使 呈现 的窗口的一部分作为非客户区的一部分实际上属于客户区。在这些情况下,您根本无法分辨标题栏的结束位置和客户区的开始位置。请参阅:msdn.microsoft.com/en-us/library/windows/desktop/… 我认为,您最好的选择可能是将 WM_NCHITTEST 消息显式发送到应用程序。因为它应该返回 HTCAPTION(前提是它也可以自行处理 WM_NCHITTEST)
  • 很好,我想这就是我想要的。这适用于 Chrome,但 Excel 总是在任何地方报告“客户区”。不过,我想这是 Excel 的错 =)

标签: c++ winapi


【解决方案1】:

标题栏点击是通过消息“非客户端”消息 - 即不是客户端(或内部)窗口的窗口区域。

WM_NCLBUTTONDOWN 可能是您要捕获的消息。

您可能还想设置一个window hook 来挂钩鼠标消息,如果它是您想要的 NC 消息,您可以按照自己的方式处理,如果不是 - 将其传递到消息链。

编辑:如果 Chrome 使用 DwmExtendFrameIntoClientArea 调用来绘制选项卡,那么您将需要使用 WM_NCHITTEST。

【讨论】:

  • 谢谢!稍后我可能会尝试这种方法(因为我真的在使用 C# 并且全局挂钩似乎很困难)。
猜你喜欢
  • 1970-01-01
  • 2011-05-21
  • 2012-11-16
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 2011-03-15
相关资源
最近更新 更多