如何拦截透明窗口的鼠标事件?

5
我有一个通过WS_EX_LAYERED创建的透明窗口,我想接收零透明度区域的鼠标事件。
据我所知,我可以:
1) 使用鼠标钩子
2) 将背景绘制为几乎完全透明的颜色(不透明度为1)
然而,第一种解决方案耗时,而第二种方案会减慢我的渲染时间,因为我的窗口几乎覆盖整个桌面,并且大多数像素目前都是完全透明的。
是否有另一种方法可以接收这些鼠标事件?

你是否需要这种通用功能始终存在,还是只在某些时候(例如,当您的窗口是活动窗口时)需要?如果是后者,您可以捕获鼠标。 - Adrian McCarthy
钩子的另一个问题是你必须非常小心,确保你的窗口在最上面,这样你就不会窃取其他窗口的点击。也许如果你提供更多关于你想要实现什么的信息会有所帮助。 - Adrian McCarthy
我来更好地解释一下,我正在绘制PNG图标并尝试检测鼠标是否悬停在这些项目上。现在大多数图标都有零Alpha区域,当我将鼠标悬停在它们上面时,由于它们的容器窗口是透明的,我无法获取WM_MOUSEMOVE事件。 - Omer
1个回答

1
根据MSDN的说法:
分层窗口的命中测试基于窗口的形状和透明度。这意味着窗口的颜色键控区域或alpha值为零的区域将允许鼠标消息通过。但是,如果分层窗口具有WS_EX_TRANSPARENT扩展窗口样式,则将忽略分层窗口的形状,并将鼠标事件传递给分层窗口下面的其他窗口。
然而,在新线程中,您可以使用GetCursorPos连续获取鼠标的坐标,如果位置在您的图标之一内(无论它是否位于图标内部的alpha值为零的像素上),则进行处理。不比钩子好太多。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接