4

z オーダーの一番下に設定すると、そこにとどまるフォームが必要です。私は試した:

SetWindowPos(Handle,HWND_BOTTOM,Left,Top,Width,Height,SWP_NOZORDER);

他のアプリと重ねると、必要に応じて一番下に留まります。しかし、それをクリックすると、一番上に上がります。次に試しました:

SetWindowPos(Handle, HWND_BOTTOM, Left, Top, Width, Height,
             SWP_NOACTIVATE or SWP_NOZORDER);

このWebサイトのその他のさまざまなスイッチ... http://msdn.microsoft.com/en-us/library/ms633545.aspx

しかし、それはまだトップに上がります。

4

3 に答える 3

9

SetWindowPosウィンドウが呼び出されたときにのみウィンドウの位置を設定し、状態を確立しません。処理WM_WINDOWPOSCHANGINGはこれを行う正しい方法です:

このメッセージの処理中に、WINDOWPOSの値を変更すると、ウィンドウの新しいサイズ、位置、またはZオーダーの位置に影響します。アプリケーションは、WINDOWPOSのフラグメンバーの適切なビットを設定またはクリアすることにより、ウィンドウの変更を防ぐことができます。


type
  TForm1 = class(TForm)
    ..
  private
    procedure WindowPosChanging(var Msg: TWMWindowPosMsg);
        message WM_WINDOWPOSCHANGING;
  end;

..

procedure TForm1.WindowPosChanging(var Msg: TWMWindowPosMsg);
begin
  if Msg.WindowPos.flags and SWP_NOZORDER = 0 then
    Msg.WindowPos.hwndInsertAfter := HWND_BOTTOM;
  inherited;
end;
于 2011-11-26T02:02:04.697 に答える
1

試したことはありませんが、メッセージ WM_WINDOWPOSCHANGING をトラップし、Z オーダーをいじる可能性があります。ただし、複雑になる可能性があり、個人的にはイライラするほど標準的ではないと思います。

cacsade に相当するが z オーダーの並べ替えを備えたメニュー オプションの方が適切なオプションである可能性があります。

于 2011-11-26T01:40:19.730 に答える
0

本能的に、アプリが常に期待どおりに機能するとは信じていません。他のアプリケーションには、強制的に自分自身を自分の前に持ってくる、またはあなたの場合はその逆で、自分を後ろに送るという、はるかに厳密な方法があるかもしれません。たとえば、ウィンドウを背面に繰り返し送信するタイマー。次に、そのようなアプリを 2 つ階層化すると、基本的に前後にちらつきながら、互いに戦うのを見ることができます。結局、他のアプリケーションが自分のアプリケーションを上書きするために何をするか分からないので、これに対する恒久的な 100% の解決策は期待できません。

于 2011-11-26T15:29:51.360 に答える