我知道这是一个非常古老的东西,但我正在破坏我的大脑。有谁知道为什么会这样?
比方说,当滚动条鼠标点击通知通过WM_NCHITTEST
- > WM_NCLBUTTONDOWN
- > WM_SYSCOMMAND
- > WM_HSCROLL
或WM_VSCROLL
传播时,此链中的所有参数似乎都遵循文档,除了SC_HSCROLL
和SC_VSCROLL
以及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
。 WTF?
如果在调试器下查找__int64 OnDwpNcLButtonDown(CThhemeWnd*, THEME_MSG*)
可见下一个代码:
wParam = HTVSCROLL != HitTest ? SC_VSCROLL : SC_HSCROLL;
SendMessage(*, WM_SYSCOMMAND, (wParam | HitTest), *)
WM_SYSCOMMAND
与SC_VSCROLL
或SC_HSCROLL
从这一点发送,但明显的代码包含逻辑错误 - SC_VSCROLL
和SC_HSCROLL
混淆。
必须是正确的代码
wParam = HTVSCROLL == HitTest ? SC_VSCROLL : SC_HSCROLL;
也
在WM_SYSCOMMAND消息中,wParam参数的四个低位由系统内部使用。要在测试wParam的值时获得正确的结果,应用程序必须使用按位AND运算符将值0xFFF0与wParam值组合。
在这里可见,我们已经从WM_NCLBUTTONDOWN
消息中找到了四个低位,这是来自WM_NCHITTEST
消息返回
0xf087
- 这是SC_HSCROLL | HTVSCROLL
,当在hscroll我们得到0xf076
这是SC_VSCROLL | HTHSCROLL
这只是uxtheme.OnDwpNcLButtonDown
中的windows bug