滚动鼠标下的窗口

GIL*_*ESH 4 c++ windows winapi messages mouseevent

如果您看一下Visual Studio 2012,您会注意到如果使用鼠标滚轮,鼠标下方的窗口将滚动,而不是聚焦窗口.也就是说,如果您将光标放在代码编辑器中,并将鼠标移到"解决方案资源管理器"窗口并滚动,则解决方案资源管理器将滚动,而不是代码编辑器.但是,WM_MOUSEWHEEL消息只会被发送到焦点窗口,因此在这种情况下,代码编辑器.我们如何实现我们的程序,使WM_MOUSEWHEEL消息滚动鼠标下的窗口,这是直观的,而不是聚焦窗口?

GIL*_*ESH 6

显然,我们可以在该计划的核心问题上解决这个问题.查看消息循环的代码,该代码应该在WinMain方法中:

while (GetMessage (&msg, NULL, 0, 0) > 0)
{
    TranslateMessage (&msg);
    DispatchMessage (&msg);
}
Run Code Online (Sandbox Code Playgroud)

在这里,我们只需要说如果消息是WM_MOUSEWHEEL消息,我们想将它传递给鼠标下的窗口,而不是焦点窗口:

POINT mouse;

while (GetMessage (&msg, NULL, 0, 0) > 0)
{
    //Any other message.
    if (msg.message != WM_MOUSEWHEEL)
    {
        TranslateMessage (&msg);
        DispatchMessage (&msg);
    }
    //Send the message to the window over which the mouse is hovering.
    else
    {
        GetCursorPos (&mouse);
        msg.hwnd = WindowFromPoint (mouse);
        TranslateMessage (&msg);
        DispatchMessage (&msg);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,鼠标下的窗口将始终获得滚动消息,而不是聚焦窗口.