检测窗体最小化的所有情况

时间:2013-11-25 14:27:19

标签: windows delphi delphi-xe2

我需要检测何时最小化表单(隐藏叠加表单)。我拦截WM_SYSCOMMAND消息,如果我单击表单的最小化按钮它可以正常工作,但如果我使用[Windows] + [M],这个事件似乎不会被触发。此外,在这种情况下,WM_ACTIVATEWM_ACTIVATEAPP不会被触发。

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

3 个答案:

答案 0 :(得分:5)

如此处所述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时有解决方案。

答案 1 :(得分:5)

由于WM_SIZE不会在不使用设置Application.MainFormOnTaskbar := True;的项目的主窗体上调用,所以我建议采用一种方法,灵感来自@kobik对, How to detect when the form is being maximized?的回答。

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;

答案 2 :(得分:2)

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

相关问题