3

我知道这是一个非常古老的东西,但我正在为此绞尽脑汁。有谁知道为什么会这样?

比如说,当滚动条鼠标点击通知通过WM_NCHITTEST-> WM_NCLBUTTONDOWN-> WM_SYSCOMMAND-> WM_HSCROLLor传播时WM_VSCROLL,这个链中的所有参数似乎都遵循文档,除了SC_HSCROLLSC_VSCROLLfor WM_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++ 的证明。如果我单击此向下箭头:

在此处输入图像描述

这些是窗口收到的通知:

在此处输入图像描述

全部正确,除了SC_HSCROLL. 怎么回事?

4

1 回答 1

1

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

在此处输入图像描述

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

与或从这一点发送,但明显的代码包含逻辑错误 -WM_SYSCOMMAND和混淆。SC_VSCROLLSC_HSCROLLSC_VSCROLLSC_HSCROLL

正确的代码必须是

wParam = HTVSCROLL == HitTest ? SC_VSCROLL : SC_HSCROLL;

WM_SYSCOMMAND消息中, wParam参数的四个低位 由系统内部使用。为了在测试wParam的值时获得正确的结果,应用程序必须使用按位与运算符将值 0xFFF0 与wParam值组合。

在这里可以看到,我们已经从消息中命中了测试代码的四个低位WM_NCLBUTTONDOWN,这是来自WM_NCHITTEST消息返回

0xf087- 这是SC_HSCROLL | HTVSCROLL,当我们在 hscroll 上时,我们得到0xf076的是SC_VSCROLL | HTHSCROLL

这只是 Windows 中的错误uxtheme.OnDwpNcLButtonDown

于 2019-04-05T09:33:38.060 回答