8

次の問題があります。かなり大きなアプリケーション(win32、Delphi 6 Enterprise)を構築しています。アプリケーションのいくつかの部分では、モーダルウィンドウが使用され、通常はメインウィンドウの選択の詳細が含まれています。

ウィンドウがモーダルの場合、SW_SHOWMINNOACTIVEメッセージがアプリケーションのメインウィンドウに送信されるように、WM_SYSCOMMANDメッセージの処理の変更を含めました。これにより、モーダル形式だけでなく、アプリケーション全体が最小化されます。

ただし、特定の場合に問題が発生します。呼び出しウィンドウが全画面に設定されている場合、復元時に、モーダルウィンドウが(無効にされた)最大化されたメインウィンドウの下に表示されます(これはWindows 7で発生するようです)

私の問題は2つあります。

まず、アプリケーションを復元しても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;

私たちのフォームはすべて、そのフォームから派生しています。

4

2 に答える 2

3

ダイアログのCreateParams機能をオーバーライドParams.WndParentし、フルスクリーン ウィンドウに設定します (またはOwner.Handle、適切に所有している場合)。デフォルトはApplication.Handleで、このような問題が発生します。それPopupParent以降の Delphi リリースで導入されたプロパティは、まったく同じことを行います。

于 2011-06-10T15:31:43.643 に答える
1

これは、(私が思うに)XPで導入されたWindowsによるウィンドウゴーストと関係があります。これらのオペレーティングシステムのD5アプリでも同じ問題が発生します。ペーター・ベロウは当時、次の回避策を提供しましたが、それでも私には役立ちます。

procedure DisableProcessWindowsGhosting;
type
  TDisableProcessWindowsGhostingProc = procedure; stdcall;
const
  sUser32 = 'User32.dll';
var
  ModH: HMODULE;
  _DisableProcessWindowsGhosting: TDisableProcessWindowsGhostingProc;
begin
  ModH := GetModuleHandle(sUser32);
  if ModH <> 0 then begin
    @_DisableProcessWindowsGhosting := nil;
    @_DisableProcessWindowsGhosting := GetProcAddress(ModH,
        'DisableProcessWindowsGhosting');
    if Assigned(_DisableProcessWindowsGhosting) then begin
      _DisableProcessWindowsGhosting;
    end;
  end;
end;

アプリのメインフォームのOnCreateハンドラーの先頭で呼び出します。

于 2011-06-10T11:32:16.503 に答える