【问题标题】:How to send a WPF window to the back?如何将WPF窗口发送到后面?
【发布时间】:2010-11-13 23:00:21
【问题描述】:

在我的应用程序中,我有一个用于绘制调试数据的窗口。当它加载时,我想在所有其他窗口后面“在后台”打开它。

实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: c# .net wpf window


    【解决方案1】:

    您是否有任何特殊原因不想以最小化状态显示窗口并允许用户显示它?如果以最小化状态显示窗口可以解决您的问题,请使用

    <Window WindowState="Minimized" (...)>
    

    【讨论】:

    • 我希望窗口从一开始就在后台打开。感谢您的建议,但对我没有帮助。
    【解决方案2】:

    您可以使用以下代码:

    [DllImport("user32.dll")]
    static extern bool SetWindowPos(
        IntPtr hWnd,
        IntPtr hWndInsertAfter,
        int X,
        int Y,
        int cx,
        int cy,
        uint uFlags);
    
    const UInt32 SWP_NOSIZE = 0x0001;
    const UInt32 SWP_NOMOVE = 0x0002;
    
    static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
    
    static void SendWpfWindowBack(Window window)
    {
        var hWnd = new WindowInteropHelper(window).Handle;
        SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    }
    

    来源:http://www.aeroxp.org/board/lofiversion/index.php?t4983.html

    【讨论】:

    • 使用 System.Runtime.InteropServices 添加;
    • 您报告的代码无法按原样运行(请参阅链接线程)。您需要添加:“const UInt32 SWP_NOACTIVATE = 0x0010;”并将“SWP_NOSIZE | SWP_NOMOVE”替换为“SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE”。有了这个修改就可以了。
    • 我知道这个帖子很旧,但我需要一些建议。上面的代码有效,但如果我后来将&lt;window&gt;.Topmost 设置为true,那么什么也不会发生。我不想Activate()窗口,在使用上面的代码将它发送到后面之后似乎需要它。
    • 嗯,不错的把戏。似乎工作......有点。我也在尝试开发一个小部件样式的应用程序,我发现这个答案缺乏的地方是当用户按下显示桌面按钮时应用程序被最小化。在这种情况下,我也想把它放在桌面上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多