让鼠标通过Windows C ++

Jod*_*der 5 mouse winapi gdi pass-through

我正在一个Win32 C ++应用程序上工作,在这里我想忽略鼠标事件,然后将其传递到窗口下方的窗口中。基本上,我下面的窗口将处理鼠标事件。我不希望不使用SendMessage将鼠标消息发送到我下面的窗口或使用SetCapture。有没有一种基本方法可以忽略鼠标事件,并使其通过Windows API或样式传递?请注意,我的窗口不是透明的。

在此先感谢您的帮助。

小智 5

因此,在尝试创建一个音乐播放器时,我发现了这个问题以及其他问题,该音乐播放器可以在屏幕上覆盖图形显示,而不会影响任何其他交互,例如,拖动窗口。

我已经尝试了这两种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);
Run Code Online (Sandbox Code Playgroud)

似乎此行为记录在这里

分层窗口的命中测试基于窗口的形状和透明度。这意味着使用彩色键或alpha值为零的窗口区域将使鼠标消息通过。但是,如果分层窗口具有WS_EX_TRANSPARENT扩展窗口样式,则分层窗口的形状将被忽略,并且鼠标事件将传递到分层窗口下方的其他窗口。

扩展的窗口风格的文档也是非常有用的。对于不希望与之交互的窗口之类的应用程序(如我的应用程序)WS_EX_NOACTIVATE,由于它可以防止某些用户交互,因此也很有用。

为了后代的缘故,我将注意以下用于确保窗口始终位于顶部的代码:

SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
Run Code Online (Sandbox Code Playgroud)


Adr*_*thy 2

我会尝试处理WM_NCHITTEST并返回HTNOWHERE.

我相信使用 WS_EX_TRANSPARENT 的方法会产生其他副作用,并且仅当底层窗口由同一线程拥有时才有用。从问题来看,尚不清楚底层窗口是否属于同一应用程序或下面的任何旧应用程序的一部分。