当窗口未最大化时,丢失的WM_NClButtonUp消息的好奇问题

问题描述 投票:0回答:2

eDit

感谢您的前两个答复,我尝试在Nclbuttondown中调用发行版,但没有效果(实际上,它返回了null,表明没有捕获的捕获)。我只能假设基类(DEF窗口Proc)功能可以设置捕获。我将在星期一进行调查...

我也有同样的问题。问题确实是,左键单击窗口字幕开始拖动,因此鼠标捕获,从而防止WM_NClButtonUp到达。

解决方案是覆盖wm_nchittest:

LRESULT CALLBACK WndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) { switch (nMsg) { ... case WM_NCHITTEST: Point p(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam); ScreenToClient(p); if (myButtonRect.Contains(p)) { return HTBORDER; } break; } return DefWindowProc(hWnd, nMsg, wParam, lParam); } 因此,您从本质上告诉Windows,按钮所占据的区域不是窗口标题的一部分,而是非客户区域(HTBORDER)的非特异性部分。
footnote:如果您已调用setCapture(),尚未称为reareSecapture()当您期望WM_NClButtondown消息进入时,即使上述更改也不会到达。这可能会很刺激,因为在与此类自定义按钮交互过程中捕获鼠标是正常的,因此您可以取消单击/突出显示鼠标离开窗口。但是,作为使用捕获的替代方法,您可以考虑使用短(例如100毫秒)间隔的settimer()/killtimer(),这不会导致WM_NClButtonUp消息消失。

c++ winapi mfc
2个回答
5
投票
疯狂的猜测 - 一些代码正在捕获鼠标,可能是为了促进窗口移动时抓取标题。这也可以解释为什么在调试器中破裂会导致消息显示 - 调试器的交互正在清除鼠标捕获。

我建议您在该窗口上运行间谍++,它是孩子,然后尝试找出谁获取按钮的消息。

是如何修复它 - 不查看实际代码而无法帮助您。您必须弄清楚罪魁祸首是谁并查看其代码。

要添加到Franci Penov的答案
,单击标题栏被解释为重新定位窗口的阻力的开始。窗口正在捕获鼠标,因此可以执行阻力。由于无法拖动最大化的窗口,因此会跳过捕获,并正常消息路由。

wm_nclbuttondown {code block}


2
投票
在WM_NClButtondown(如果在基本之前调用),您可以将M.Wparam迫使M.Wparam到1(客户端区域)代替2(标题区域)。这将避免桌面管理器捕获鼠标。 我对WM_NClButtonUp做同样的操作,并使用基于getDoubleclicktime()的计时器来管理单击或双击...

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.