我需要检测表单何时最小化(隐藏覆盖表单)。 我拦截WM_SYSCOMMAND
消息,如果我单击窗体的最小化button,它工作正常,但如果我使用[Windows] + [M]这个事件似乎不会被解雇。 另外,在这种情况下, WM_ACTIVATE
和WM_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通知消息。