Manuseio adequado do comportamento da janela modal “Minimizar”

Eu tenho o seguinte problema: estamos construindo um aplicativo bastante grande (win32, Delphi 6 Enterprise). Em várias partes do aplicativo, janelas modais são usadas, geralmente contendo os detalhes da seleção da janela principa

Incluímos uma modificação no tratamento das mensagens WM_SYSCOMMAND para que, se a janela for modal, uma mensagem SW_SHOWMINNOACTIVE seja enviada para a janela principal do aplicativo. Isso faz com que todo o aplicativo seja minimizado, em vez de apenas a forma moda

No entanto, existe um problema em um caso específico: se a janela de chamada estiver configurada para tela cheia, após a restauração, a janela modal aparecerá SOB A janela principal maximizada (desativada) (isso parece acontecer no Windows 7)

Meu problema é duplo:

Primeiro, parece que não recebo mais nenhuma mensagem de comando do sistema quando o aplicativo é restaurado, por isso não posso introduzir código para restaurar o Z-Order, porque não sei onde colocá-lo. Segundo, parece-me que, se todo o aplicativo for minimizado, clicar no botão do aplicativo na barra de tarefas deve restaurá-lo no mesmo estado, não com uma janela modal embaixo. Existe uma maneira de corrigir isso?

Edit: fizemos alguns testes adicionais e parece que podemos realmente detectar o problema no manipulador WM_ACTIVATE para o formulário principal. Também podemos identificar a janela modal nessa fase. No entanto, não consigo encontrar uma maneira de restaurá-lo para o topo da Ordem Z.

Edit2: aqui está o código que minimiza o aplicativo quando o formulário modal é minimizado:

procedure TfmGITForm.WMSysCommand(var Message: TWMSysCommand);
begin
  if (fsModal in FormState) or
      not Application.MainForm.Visible then
  begin
    case Message.CmdType of
      SC_MINIMIZE:
      begin
        ShowWindow(Application.Handle, SW_SHOWMINNOACTIVE);
      end;
      SC_RESTORE:
      begin
        ShowWindow(Application.Handle, SW_SHOWNORMAL);
        inherited;
      end;
    else
      inherited;
    end;    // case
  end
  else
    inherited;
end;

Todos os nossos formulários descendem dess

questionAnswers(2)

yourAnswerToTheQuestion