我想检测表单何时最大化以保存某些设置(与大小和位置无关)并稍微修改大小和位置。有通用的方法吗? 我试图捕获像this article中的WM_SYSCOMMAND消息。通过最大化按钮,它可以很好地从菜单中最大化,但是当我按下WIN + UP按键时它不会被触发。有没有人知道如何捕捉最大化事件的通用方法,包括WIN + UP击键的情况?
由于
答案 0 :(得分:11)
您可以使用WM_GETMINMAXINFO
消息保存窗口状态,然后使用WMSize
消息检查窗口是否已最大化。
在你的表单中声明了这样的消息处理程序:
procedure WMSize(var Msg: TMessage); message WM_SIZE;
并按照这样处理:
procedure TForm57.WMSize(var Msg: TMessage);
begin
if Msg.WParam = SIZE_MAXIMIZED then
ShowMessage('Maximized');
end;
答案 1 :(得分:7)
WIN + UP不会生成WM_SYSCOMMAND
消息,这就是您无法捕获它们的原因。但它会生成WM_GETMINMAXINFO
,WM_WINDOWPOSCHANGING
,WM_NCCALCSIZE
,WM_MOVE
,WM_SIZE
和WM_WINDOWPOSCHANGED
消息。与RRUZ说的一样,使用WM_GETMINMAXINFO
来检测最大化操作何时开始,WM_SIZE
来检测何时完成。
答案 2 :(得分:7)
IMO,你不能使用WM_GETMINMAXINFO
来“检测最大化操作 即将开始 ”,正如@Remy所述。
事实上唯一可能是WM_SYSCOMMAND
Msg.CmdType=SC_MAXIMIZE
或未记录SC_MAXIMIZE2 = $F032
的邮件 - 但不会通过Win+UP
或使用{{1}发送例如。
我能够检测到窗口即将最大化的唯一方法是通过ShowWindow(Handle, SW_MAXIMIZE)
之后立即触发的WM_WINDOWPOSCHANGING
:
WM_GETMINMAXINFO