【问题标题】:How to intercept mouse events of a transparent window?如何拦截透明窗口的鼠标事件?
【发布时间】:2011-08-28 07:15:51
【问题描述】:

我有一个透明窗口(使用 WS_EX_LAYERED 创建),我想接收零 alpha 区域的鼠标事件。
据我所知,我可以:

1) 使用鼠标钩
2)用几乎完全透明的颜色(不透明度为1)绘制背景

但是,第一个解决方案很耗时,而第二个解决方案会减慢我的渲染时间,因为我的窗口几乎在整个桌面上都被拉伸了,而且目前大多数像素都是完全透明的。

还有其他方式接收这些鼠标事件吗?

【问题讨论】:

  • 您是否始终需要这种通用功能,或者只是在某些时候(例如,当您的窗口是活动窗口时)。如果是后者,你可以捕获鼠标。
  • 钩子的另一个问题是你必须非常小心你的窗口在顶部,这样你就不会窃取其他窗口的点击。如果您提供更多有关您想要实现的目标的信息,也许会有所帮助。
  • 我会更好地解释它,我正在绘制 PNG 图标并尝试检测鼠标是否悬停在这些项目上。现在大多数图标的 alpha 区域为零,当我将它们悬停时,我没有收到 WM_MOUSEMOVE 事件,因为它们的容器窗口是透明的。

标签: c++ windows graphics gdi


【解决方案1】:

根据 MSDN:

分层窗口的命中测试是 根据形状和透明度 窗户。这意味着这些地区 颜色键控的窗口或 其 alpha 值为零将让 鼠标消息通过。然而,如果 分层窗口有 WS_EX_TRANSPARENT 扩展窗口 样式,分层窗口的形状 将被忽略并且鼠标事件 将传递给其他窗口 在分层窗口下方。

但是,在一个新线程中,您可以使用GetCursorPos 连续获取鼠标的坐标,并且如果该位置在您的一个图标内(不管它是否超过图标内的零 alpha 像素),您可以处理它。比钩子好不了多少

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2011-10-25
    • 2011-11-09
    • 2014-07-01
    • 1970-01-01
    相关资源
    最近更新 更多