因此,我在尝试创建一个音乐播放器时发现了这个问题和其他问题,该音乐播放器在屏幕上覆盖图形显示而不影响任何其他交互,包括例如拖动窗口。
我已经尝试过WM_NCHITTEST
方法,以及简单地添加WS_EX_TRANSPARENT
到我的窗户。这两种方法都不起作用——它们似乎都捕获了鼠标单击事件,这是我不想要的。
然而,纯属巧合,我确实找到了可以传递给的标志组合SetWindowLong(..., GWL_EXSTYLE, ...)
这似乎可以解决问题,导致以下代码:
LONG cur_style = GetWindowLong(hwnd, GWL_EXSTYLE);
SetWindowLong(hwnd, GWL_EXSTYLE, cur_style | WS_EX_TRANSPARENT | WS_EX_LAYERED);
看来这种行为已被记录here:
分层窗口的命中测试基于窗口的形状和透明度。这意味着窗口中带有颜色键控或 alpha 值为零的区域将允许鼠标消息通过。但是,如果分层窗口具有 WS_EX_TRANSPARENT 扩展窗口样式,则分层窗口的形状将被忽略,并且鼠标事件将传递到分层窗口下方的其他窗口。
The 扩展窗口样式文档也很有用。对于像我这样的应用程序,窗口不应该与之交互,WS_EX_NOACTIVATE
也可能很有用,因为它阻止了一些用户交互。
为了后代的缘故,我将注意到我用来确保我的窗口始终位于顶部的代码如下:
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);