获取非客户端“关闭”按钮的 hWnd [x] (win32)

Posted

技术标签:

【中文标题】获取非客户端“关闭”按钮的 hWnd [x] (win32)【英文标题】:Get the hWnd of the non-client "close" button [x] (win32) 【发布时间】:2012-10-20 12:48:57 【问题描述】:

我的应用需要显示一个指向upper-right[x] 按钮的信息气球,指示必须通过单击pointed [x] 按钮关闭窗口。

出于这个原因,我需要获得[x] 按钮hWnd 或者如果知道它的(未记录的)资源ID。你们知道如何用普通的win32?来做到这一点

我尝试过处理非客户端元素指标的其他替代方案,但它们都给出了不一致的结果(考虑我的应用从 W2K 运行到 W8

谢谢

【问题讨论】:

您可以通过发送 WM_NCHITTEST 消息来探测它。当您获得 HTCLOSE 时,您会找到关闭字形。 既然你说你需要支持Windows 2000,你就不能使用WM_GETTITLEBARINFOEX这个消息。相反,您必须使用 Active Accessibility 来定位 Close 对象,然后询问其 accLocation WM_GETTITLEBARINFOEX 提供了不可靠的信息,我从未使用过 Active Accessibility,我一直在观察它,似乎那些 MS 复杂的 API;关于在哪里获得一些代码示例做类似事情的任何提示? 【参考方案1】:

关闭按钮没有窗口,也没有单独的HWND。相反,它与可能的其他元素一起由底层WindowProc 绘制,作为非客户区的一部分。

【讨论】:

你怎么知道的?请不要误会我的意思;我不是在挑战你。但是我想知道您是否在某处发布了非常可能的评论,如果您在调试器上阅读了代码,或者这只是您的猜测。谢谢 这很简单。 Visual Studio 附带Common7\Tools\spyxx.exe 它枚举所有窗口并向您显示,您可以通过EnumWindows 执行相同操作。你会发现它不是一个真正的窗口。

以上是关于获取非客户端“关闭”按钮的 hWnd [x] (win32)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MFC 对话框中添加关闭按钮

怎样去掉 vc++ 的 对话框 右上角的关闭按钮??

按 x,y,w,h 裁剪图像 [关闭]

用VC++如何获取屏幕图像,且显示出来

Windows客户区窗口大小设置

未从任务栏关闭事件正确关闭