Немножко улучшил свой вариант. Теперь вообще как часы всё заработало.
var TheFormIsMinimized: Boolean = False;
TheFormWasMaximized: Boolean = False;
function NewWndProc(Wnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
begin
if (Msg = WM_SHOWWINDOW) and (LParam = SW_PARENTCLOSING) and (not TheFormIsMinimized) then
begin
TheFormIsMinimized := True;
TheFormWasMaximized := (MainForm.WindowState=TWindowState.wsMaximized);
SendMessage(FormToHWND(MainForm), WM_SYSCOMMAND, SC_MINIMIZE, 0);
MainFormp.WindowState := TWindowState.wsMinimized;
end else
if (Msg = WM_SHOWWINDOW) and (LParam = SW_PARENTOPENING) and (TheFormIsMinimized) then
begin
TheFormIsMinimized := False;
SendMessage(FormToHWND(MainForm), WM_SYSCOMMAND, SC_RESTORE, 0);
if TheFormWasMaximized
then MainForm.WindowState := TWindowState.wsMaximized
else MainForm.WindowState := TWindowState.wsNormal;
end
else Result:=CallWindowProc(OldWndProc, Wnd, Msg, WParam, LParam);
end;
Единственный недостаток: при восстановлении из wsMinimized в wsMaximized на долю секунды окно фиксируется как wsNormal. Но это, в общем-то, не страшно.