检测forms最小化的所有情况

我需要检测表单何时最小化(隐藏覆盖表单)。 我拦截WM_SYSCOMMAND消息,如果我单击窗体的最小化button,它工作正常,但如果我使用[Windows] + [M]这个事件似乎不会被解雇。 另外,在这种情况下, WM_ACTIVATEWM_ACTIVATEAPP不会被触发。

我可以使用什么事件,还有其他什么情况需要检测?

正如这里所解释的, How to detect when the form is being maximized? ,听WM_SIZE消息。

在你的表单中声明:

 procedure WMSize(var Msg: TMessage); message WM_SIZE; 

并执行:

 procedure TForm1.WMSize(var Msg: TMessage); begin Inherited; if Msg.WParam = SIZE_MINIMIZED then ShowMessage('Minimized'); end; 

更新

另请参阅@bummi的答案,当Application.MainFormOnTaskbar = false时,有解决方案。

由于WM_SIZE不会在不使用设置Application.MainFormOnTaskbar := True;的项目的mainform上调用Application.MainFormOnTaskbar := True; 我会建议一种方法,灵感来自于@kobik的答案,如何检测表单何时被最大化? 。

WM_WINDOWPOSCHANGING将被从MainFormOnTaskbar独立调用,Message.WindowPos ^ .flags上有不同的签名,并在WIN + M上响应。

 procedure TForm3.WMWindowPosChanging(var Message: TWMWindowPosChanging); const Hide1=(SWP_NOCOPYBITS or SWP_SHOWWINDOW or SWP_FRAMECHANGED or SWP_NOACTIVATE); Hide2=((SWP_HIDEWINDOW or SWP_NOACTIVATE or SWP_NOZORDER or SWP_NOMOVE or SWP_NOSIZE)); begin inherited; if ((Message.WindowPos^.flags AND Hide1) = Hide1) or ((Message.WindowPos^.flags AND Hide2) = Hide2) then begin Memo1.Lines.Add('Window got minimized'); end; end; 

使用wParam参数SIZE_MINIMIZED来监听WM_SIZE通知消息。