2016-11-08 8 views
3

メインウィンドウとポップアップで構成されたアプリケーションがあります。他のすべてのアプリケーションの上になりたいです。メインウインドウに「ウィンドウA」、トップポップアップに「ウインドウB」、別のアプリケーションのウインドウに「ウインドウC」を呼んでみましょう。私はこのコードを使用して上にウィンドウBを設定してい他のすべてのアプリケーションの上にあるDelphiウィンドウ

SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, 
       SWP_NoMove or SWP_NoSize); 

予想通りこれは動作しますが、私は別のアプリケーション(ウインドウC)を開くことができますし、ウィンドウBはトップを続けています。しかし、ウィンドウタイトルをクリックすると、「ウィンドウA」が「ウィンドウC」の上に表示されます。ウィンドウBの任意の部分をクリックするとメインウィンドウ(ウィンドウA)が正面にならないようにする方法はありますか?

+0

ウィンドウAはウィンドウBによって所有されていますか? – andlabs

+0

BのCreateParamsをオーバーライドしてWndParent = 0を設定します。ここで何度も尋ねられます。ところで、あなたはFormStyleとしてfsStayOnTopを使うことができます。 –

+0

明らかに、他のすべてのウィンドウの上にいることはできません。あなたは同じことをしたい他のウィンドウに負けてしまいます。 AはWin32の意味でのBの所有者です。 SertacがBを所有しないようにするために何を言うか。 –

答えて

4

「ウィンドウB」を常に上にするには、FormStyleプロパティをfsStayOnTopに設定することができます。SetWindowPosに電話する必要はありません。 CreateParamsを無効にするには、すべてのウィンドウでの未所有のにする必要があります。そのため、起動時に所有者を前面に持ち込まないようにします。通常のウィンドウ(= bsSizeable例えばBorderStyle)については

type 
    TWindowB = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    protected 
    procedure CreateParams(var Params: TCreateParams); override; 
    end; 

procedure TWindowB.CreateParams(var Params: TCreateParams); 
begin 
    inherited; 
    Params.WndParent := 0; 
end; 

procedure TWindowB.FormCreate(Sender: TObject); 
begin 
    FormStyle := fsStayOnTop; 
end; 

、あなたは "ウィンドウB" のタスクバーボタンやAlt + Tabキーのアイコンが表示されます。これは正常です。ウィンドウは現在アクティブ化のための他のウィンドウに依存していないので、ウィンドウをアクティブにする手段が必要です。これを避けるには、bsToolWindowまたはbsSizeToolWinBorderStyle、または隠しアプリケーションウィンドウをウィンドウ所有者として使用して、Application.HandleParams.WndParentに設定します。

最上位のウィンドウは、他の可能な最上位のウィンドウよりも優先順位がなく、いずれか1つが前面に表示される可能性があることに注意してください。

関連する問題