c++ - 在鼠标下滚动窗口

标签 c++ windows winapi mouseevent messages

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

最佳答案

显然我们可以在程序的核心解决这个问题。查看您的消息循环代码,它应该在您的 WinMain 方法中:

while (GetMessage (&msg, NULL, 0, 0) > 0)
{
    TranslateMessage (&msg);
    DispatchMessage (&msg);
}

在这里,我们只需要说明如果消息是 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);
    }
}

现在,鼠标下方的窗口将始终收到滚动消息,而不是焦点窗口。

关于c++ - 在鼠标下滚动窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20256016/

相关文章:

c++ - 在 linux 下的 GCC 中使用 std::thread 的正确链接选项是什么?

winapi - 如何在Windows-7上使进程崩溃而不显示WER对话框?

c# - 捕捉事件窗口开关(也在同一个应用程序中,例如 Chrome 标签)

c - 从 Windows gui 程序输出到命令行

c++ - 为什么 Windows 上的套接字描述符会得到这样的值?

c++ - 如何使用 Windows 内存 dc (c++) 创建 OpenGL 上下文

c++ - 为什么这段代码可以编译?

c++ - Microsoft C++ 语言引用

c++ - 调用模板方法导致 'operator<' 不匹配

c++ - MinGW-w64 编译因 nullptr_t 而失败