在WndProc中处理AeroSnap消息

dre*_*010 5 c# winapi window-messages aero

在我的C#.NET 4应用程序中,我WndProc用来处理一些消息,主要是处理从全屏调整应用程序的大小.

现在我只是处理SC_MAXIMIZEWM_NCLBUTTONDBLCLK确定窗口是否正在调整大小或从最大化状态调整(我知道我不需要WndProc来处理SC_MAXIMIZE,但是当我双击时,Form_Resize似乎没有触发WM_NCLBUTTONDBLCLK消息应用程序的标题栏.

现在我注意到,如果我将Aero Snap窗口移到屏幕顶部以使其最大化,则上述消息都不会发布,因此当通过Aero Snap最大化窗口时,不会应用某些逻辑.我只想处理消息,如果窗口被捕捉到屏幕的顶部而不是右边或左边,或者窗口是否从最大化位置取消.

我找不到任何与Aero Snap相关的窗口消息.有谁知道这些消息的任何参考?

Bre*_*McK 7

我猜这里没有任何特别的消息; Aero可能只使用普通的Win32 API - ShowWindow(SW_MAXIMIZE)等.

要理解SC_消息的是那些是来自菜单的请求,要求窗口调整大小/恢复/ etc本身,但这不是改变窗口大小的唯一机制.可能发生的是当窗口获得SC_MAXIMIZE时,DefWndProc通过调用ShowWindow(SW_MAXIMIZE)来实现它.

最好的方法是收听窗口收到的WM_SIZE消息,无论触发大小更改的是什么:系统菜单,API或其他方法.特别是,如果窗口最大化(SIZE_MAXIMIZED)或恢复(SIZE_RESTORED),lParam将通知您.

  • 这是对的.Aero Snap没有发送特殊通知.它使用标准的"WM_MOVING"/"WM_MOVE"和"WM_SIZING"/"WM_SIZE"消息.如果您在不调用"DefWindowProc"的情况下处理这些,则Aero Snap将无法用于您的窗口.是的,你可以听'WM_SIZE`,但你通常可以使用[`WM_WINDOWPOSCHANGED`](http://msdn.microsoft.com/en-us/library/windows/desktop/ms632652.aspx). .这是一个"新"功能,在Windows 3.1中引入错误.:-) [相关阅读](http://blogs.msdn.com/b/oldnewthing/archive/2008/01/15/7113860.aspx). (3认同)
  • 这个答案是不正确的,除了一小部分 WM_SIZE 可用于检测新大小。“对齐”和“最大化”不是一回事:IsZoomed(hwnd) 返回 false。窗口的系统菜单显示最大化和最小化均已启用,但恢复未启用,因为窗口处于正常/恢复状态。WM_SIZE 是通过 SIZE_RESTORED 接收的,而不是通过 SIZE_MAXIMIZED 接收的。 (2认同)