edit: Извините, когда я пишу «это не работает», я имею в виду, что это не решает проблему модальной формы, находящейся под развернутой формой, при восстановлении приложения из свернутого состояния. Код выполняется правильно и полностью.

я следующая проблема: мы создаем довольно большое приложение (win32, Delphi 6 Enterprise). В некоторых частях приложения используются модальные окна, обычно содержащие детали выбора основного окна.

Мы включили модификацию обработки сообщений WM_SYSCOMMAND так, чтобы, если окно было модальным, то сообщение SW_SHOWMINNOACTIVE было отправлено в главное окно приложения. Это приводит к минимизации всего приложения, а не только модальной формы.

Однако в конкретном случае возникает проблема: если окно вызова установлено в полноэкранный режим, то при восстановлении модальное окно появится ПОД (отключенным) развернутым главным окном (это, кажется, происходит в Windows 7)

Моя проблема в два раза:

Во-первых, мне кажется, что при восстановлении приложения я не получаю никакого сообщения syscommand, поэтому я не могу ввести код для восстановления Z-порядка, потому что я не знаю, где его разместить. Во-вторых, мне кажется, что, если все приложение свернуто, нажатие на кнопку приложения на панели задач должно восстановить его в том же состоянии, а не с модальным окном под ним. Есть ли способ это исправить?

Изменить: мы провели дополнительное тестирование, и, похоже, мы действительно можем обнаружить проблему в обработчике WM_ACTIVATE для основной формы. Мы также можем определить модальное окно на этом этапе. Однако я не могу найти способ восстановить его до вершины Z-порядка.

Edit2: вот код, который минимизирует приложение, когда модальная форма свернута:

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;

Все наши формы происходят от этого.

Ответы на вопрос(2)

Ваш ответ на вопрос