我知道这是一个非常古老的东西,但我为此感到不知所措。有人知道为什么会这样吗?

说,通过WM_NCHITTEST-> WM_NCLBUTTONDOWN-> WM_SYSCOMMAND-> WM_HSCROLLWM_VSCROLL传播滚动条鼠标单击通知时,此链中的所有参数似乎都遵循文档,但 SC_HSCROLL SC_VSCROLLWM_SYSCOMMAND除外。因此,如果我这样做:

//From within WndProc
if(message == WM_SYSCOMMAND)
{
    UINT uiCmd = wParam & 0xFFF0;
    if(uiCmd == SC_HSCROLL)
    {
        TRACE(L"Horiz scroll\n");
    }
    else if(uiCmd == SC_VSCROLL)
    {
        TRACE(L"Vertical scroll\n");
    }
}

我似乎收到有关水平的垂直通知,反之亦然。

这是Spy ++的证明。如果单击此向下箭头:

c++ - 为什么在WM_SYSCOMMAND中似乎切换了SC_HSCROLL和SC_VSCROLL?-LMLPHP

这些是窗口收到的通知:

c++ - 为什么在WM_SYSCOMMAND中似乎切换了SC_HSCROLL和SC_VSCROLL?-LMLPHP

SC_HSCROLL外,其他所有方法均正确。 WTF?

最佳答案

如果在调试器下查找__int64 OnDwpNcLButtonDown(CThhemeWnd*, THEME_MSG*),则可见下一个代码:

c++ - 为什么在WM_SYSCOMMAND中似乎切换了SC_HSCROLL和SC_VSCROLL?-LMLPHP

wParam = HTVSCROLL != HitTest ? SC_VSCROLL : SC_HSCROLL;
SendMessage(*, WM_SYSCOMMAND, (wParam | HitTest), *)

从这一点发送的带有WM_SYSCOMMANDSC_VSCROLLSC_HSCROLL,但是明显的代码包含逻辑错误-SC_VSCROLLSC_HSCROLL混淆了。

正确的代码必须是
wParam = HTVSCROLL == HitTest ? SC_VSCROLL : SC_HSCROLL;





在这里可见,在四个低位位,我们从 WM_NCLBUTTONDOWN 消息命中了测试代码,这是从 WM_NCHITTEST 消息返回的
0xf087-这是SC_HSCROLL | HTVSCROLL,当在hscroll上我们得到0xf076,它是SC_VSCROLL | HTHSCROLL
这只是uxtheme.OnDwpNcLButtonDown中的Windows错误

09-25 16:03