在窗口循环中,在窗口控件上获取鼠标移动比子类化更容易

easier way to get mouse movenment on window control IN WINDOW LOOP than subclassing

本文关键字:窗口 移动 更容易 鼠标 子类 循环 控件 获取      更新时间:2023-10-16

首先,是的,我读过其他文章(我喜欢你的"类似问题标题"窗口),我只是想知道是否有更好的方法。

问题:当使用效果或任何其他涉及跟踪的东西时,WinAPI似乎决定按钮、编辑以及所有其他常见控件不会将WM_MOUSEMOVE传递给其父句柄。例如,当用户在按钮上停留(实际移动)太久,并且无意中触发了事件时,就会出现这种情况。

最初的问题:如何解决?

答案1:子类。非常方便和安全,但也需要一些时间,所以现在跳过它。

答案2:TrackMouseEvent+"if conditioning"-->可能很慢,而且肯定会变得非常复杂。

NoGo:使用通知标志作为按钮的BS_notify不起作用,因为它们会影响鼠标点击和焦点。

问题:还有其他想法吗?Windows 7是否"秘密"引入了一个标志,或者一些程序员知道如何更容易地处理它?

注意:我不想惹恼别人。在添加不必要的代码之前,我只想问一下。

子类是迄今为止最简单的选择。如果你正在寻找一个更简单的选择,你找不到。如链接所示,只需极少量的代码就可以解决您的问题。如果您希望具有这样的功能,即父句柄确实将WM_MOUSEMOVE消息传递到窗口层次结构中,只需将其子类化,然后在处理该消息时将参数转发到父句柄上。

然而,我有点不清楚你所说的是什么意思

例如-在按钮上停留(实际移动)太久,事件被无意触发

例如:

LRESULT CALLBACK ButtonProc(HWND hWnd, UINT uMsg, WPARAM wParam,
                               LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
    switch (uMsg)
    {
    case WM_MOUSEMOVE:
        SendMessage((HWND)dwRefData, uMsg, wParam, lParam);
    }
    return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}

这是假设您在dwRefData下传入了父HWND