【发布时间】: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 的错 =)