ホームページ >バックエンド開発 >C++ >WPF で「デスクトップ上」および「下位」ウィンドウの配置を実現するにはどうすればよいですか?

WPF で「デスクトップ上」および「下位」ウィンドウの配置を実現するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-29 02:00:11999ブラウズ

How Can I Achieve

WPF のウィンドウ配置コントロール: "デスクトップ上" オプション

Rainlendar のウィンドウを "デスクトップ上" に配置する機能により、ウィンドウは最下位ウィンドウとして動作できます。これは WPF の組み込み機能ではありませんが、C# からの P/Invoke を必要とする Win32 API 呼び出しを使用して実現できます。

Rainlendar のオプション:

Rainlendar では、ウィンドウの配置に 2 つのオプションがあります:

  • オンデスクトップ: ウィンドウは、SetParent API を使用して親を設定するのと同様に、Explorer デスクトップ ウィンドウの子になります。
  • 下側: ウィンドウは Z の一番下に残ります。 - デスクトップのすぐ上に配置します。

デスクトップでの達成配置:

WPF ウィンドウを「デスクトップ上」に配置するには、SetParent API を使用できます。

[DllImport("user32.dll")]
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

hWndNewParent を IntPtr.Zero に設定すると、親が削除され、ウィンドウが作成されます。デスクトップの子。

最下位で達成配置:

ウィンドウを「下」に維持するには、WM_WINDOWPOSCHANGING メッセージをインターセプトする必要があります:

protected override void WndProc(ref Message m)
{
    if (m.Msg == (int) WM.WINDOWPOSCHANGING)
    {
        var pos = (WINDOWPOS) Marshal.PtrToStructure(m.LParam, typeof(WINDOWPOS));
        // Check if the window is being promoted to the top
        if ((pos.flags & SWP_NOMOVE) == 0 && (pos.flags & SWP_NOSIZE) == 0)
        {
            pos.hwndInsertAfter = HWND_BOTTOM;
            pos.flags |= SWP_NOACTIVATE;
            Marshal.StructureToPtr(pos, m.LParam, true);
        }
    }
    base.WndProc(ref m);
}

hwndInsertAfter を HWND_BOTTOM に設定し、SWP_NOACTIVATE フラグを追加することで、ウィンドウは常に下部に残り、クリックしてもアクティブになりません。

以上がWPF で「デスクトップ上」および「下位」ウィンドウの配置を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。