最小化窗口时会发送啥消息?
Posted
技术标签:
【中文标题】最小化窗口时会发送啥消息?【英文标题】:What message is sent when you minimize a window?最小化窗口时会发送什么消息? 【发布时间】:2021-09-11 15:57:21 【问题描述】:我正在捕捉WindowProc
并寻找WM_SYSCOMMAND
/ SC_MINIMIZE
,但它只会在我通过单击其任务栏图标最小化窗口时触发该消息。
当我单击窗口的最小化按钮时,不会触发消息。
switch (Msg)
case WM_SYSCOMMAND:
switch (wParam)
case SC_MINIMIZE:
OutputDebugStringW(L"Window minimized!");
//return TRUE;
break;
我注意到我的窗口没有发送WM_SIZE
消息,然后在搜索时我发现了这个:
默认情况下,DefWindowProc 函数将 WM_SIZE 和 WM_MOVE 消息发送到窗口。如果应用程序处理 WM_WINDOWPOSCHANGED 消息而不调用 DefWindowProc,则不会发送 WM_SIZE 和 WM_MOVE 消息。在 WM_WINDOWPOSCHANGED 消息期间执行任何移动或大小更改处理而不调用 DefWindowProc 会更有效。
当我尝试通过单击最小化按钮来最小化时,我确认它发送了WM_WINDOWPOSCHANGED
。
case WM_WINDOWPOSCHANGING:
tagWINDOWPOS * wp = reinterpret_cast<tagWINDOWPOS *>(lParam);
wp->x = ...;
wp->y = ...;
wp->cx = ...;
wp->cy = ...;
LPARAM lp = reinterpret_cast<LPARAM>(wp);
我已尝试将 x, y, cx, cy
值设置为当前值,但窗口仍被最小化。
【问题讨论】:
doc 说:In WM_SYSCOMMAND messages, the four low-order bits of the wParam parameter are used internally by the system. To obtain the correct result when testing the value of wParam, an application must combine the value 0xFFF0 with the wParam value by using the bitwise AND operator.
。我不知道这是否是问题的根本原因,但您应该在检查命令代码时使用wParam & 0xFFF0
值。
【参考方案1】:
WM_SIZE
message 在窗口大小改变时发送到窗口;如果改变大小是为了最小化窗口,那么wParam
参数将是SIZE_MINIMIZED
。 (这个WM_SIZE
也会在WM_SYSCOMMAND
/SC_MINIMIZE
组合之后发送,所以你可以检测到最小化操作,不管是什么用户动作触发的。)
因此,WndProc
中的代码将遵循以下原则:
switch (Msg)
case WM_SIZE:
switch (wParam)
case SIZE_MINIMIZED:
OutputDebugStringW(L"Window minimized!");
// return TRUE;
break;
//...
break;
//...
【讨论】:
Adrian Mole,我在主题中添加了新信息,你能看看吗? @Threensy 我已经研究过使用/拦截WM_WINDOWPOSCHANGING
,但如果窗口正在最小化,我无法从该消息中知道任何方法。
当它的最小化x
和y
是WM_WINDOWPOSCHANGING
内部的负值时,但我认为不可能通过最小化这种方式来拦截它:/
@Threensy 嗯。那些 x 和 y 对最大化也是不利的……这可以通过将 flags
成员设置为 SWP_NOMOVE | SWP_NOZORDER | SWP_NOSIZE
来防止。尽管如此,阻止最小化仍然没有乐趣。工作...
@Threensy 另外,您最初的想法似乎非常接近。当您获得WM_SYSCOMMAND/SC_MINIMIZE
组合时,只需return 0;
...但是您必须然后让WM_WINDOWPOSCHANGING
处理程序调用DefWindowProc
...或者,当您'已经发现,该消息根本没有发送。以上是关于最小化窗口时会发送啥消息?的主要内容,如果未能解决你的问题,请参考以下文章
VC++中, 在鼠标已经按住窗口边缘, 要拖拽调整窗口大小的时候, 会发送啥消息?