我需要检测何时最小化表单(隐藏叠加表单)。我拦截WM_SYSCOMMAND
消息,如果我单击表单的最小化按钮它可以正常工作,但如果我使用[Windows] + [M],这个事件似乎不会被触发。此外,在这种情况下,WM_ACTIVATE
和WM_ACTIVATEAPP
不会被触发。
我可以使用什么事件,是否还有其他情况需要检测?
答案 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通知消息。