首頁 >後端開發 >C++ >如何在 WPF 中實現'在桌面上”和'在底部”視窗放置?

如何在 WPF 中實現'在桌面上”和'在底部”視窗放置?

Linda Hamilton
Linda Hamilton原創
2024-12-29 02:00:11999瀏覽

How Can I Achieve

WPF 中的視窗放置控制項:「在桌面上」選項

Rainlendar 將視窗放置在「桌面上」的能力允許它們充當最底部的視窗。這不是 WPF 的內建功能,但可以使用 Win32 API 呼叫來實現,這需要 C# 中的 P/Invoke。

Rainlendar 的選項:

Rainlendar 提供兩種窗口放置選項:

  • 開桌面: 窗口成為資源管理器桌面視窗的子窗口,類似於使用SetParent API 設定父窗口。
  • 在底部: 視窗保持在 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);
}
透過將hwndInsert 將設定將hwndInsert為HWND_BOTTOM 並加入SWP_NOACTIVATE標誌,視窗將始終保留在底部,點擊時不會啟動。

以上是如何在 WPF 中實現'在桌面上”和'在底部”視窗放置?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn