窗口对任务栏

时间:2012-07-28 19:11:42

标签: .net wpf xaml window

我的WPF窗口有问题。我将TopMost="True"设置为永远在顶部。问题是,当我点击另一个窗口(例如Firefox)时,我的窗口仍在顶部,但在任务栏后面(开始栏),所以任务栏位于顶部,然后是我的窗口,然后是Firefox窗口。我使用的是Windows 7。

Quesion:我必须在代码中更改为设置任务栏窗口的内容?

XAML代码:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Pixeli morti" Height="350" Width="525" WindowStyle="None" WindowStartupLocation="CenterScreen" WindowState="Maximized" ResizeMode="NoResize" Background="#00000000" Topmost="True" AllowsTransparency="True">
    <Grid>
        <Canvas Name="canvas1" />
    </Grid>
</Window>

1 个答案:

答案 0 :(得分:0)

这对我有用,无论你切换到什么窗口,它都会保持在顶部和任务栏上方。 我使用了SetWindowPos方法,通过p / invoke包含它。

为了完成这项工作,我们需要一些枚举和标志,提醒你可能不需要所有的标志,但总是一个好主意,拥有一个包含所有最常用的pinvoke方法的库。

public enum SetWindowPosFlags : uint
{
    SWP_ASYNCWINDOWPOS = 0x4000,
    SWP_DEFERERASE = 0x2000,
    SWP_DRAWFRAME = 0x0020,
    SWP_FRAMECHANGED = 0x0020,
    SWP_HIDEWINDOW = 0x0080,
    SWP_NOACTIVATE = 0x0010,
    SWP_NOCOPYBITS = 0x0100,
    SWP_NOMOVE = 0x0002,
    SWP_NOOWNERZORDER = 0x0200,
    SWP_NOREDRAW = 0x0008,
    SWP_NOREPOSITION = 0x0200,
    SWP_NOSENDCHANGING = 0x0400,
    SWP_NOSIZE = 0x0001,
    SWP_NOZORDER = 0x0004,
    SWP_SHOWWINDOW = 0x0040,
}
public static class HWND
{
   public static IntPtr
   NoTopMost = new IntPtr(-2),
   TopMost = new IntPtr(-1),
   Top = new IntPtr(0),
   Bottom = new IntPtr(1);
}

你也需要实际的方法,把它放在像WinApi这样的静态助手类中是个好主意

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, SetWindowPosFlags uFlags);

最后在窗口代码中我调用了带有必要参数的方法:

public Window1()
{
    InitializeComponent();
    this.SourceInitialized += (sender, args) =>
    {
        var wih = new WindowInteropHelper(this);
        WinApi.SetWindowPos(wih.Handle, HWND.TopMost, 0, 0, 0, 0, SetWindowPosFlags.SWP_NOMOVE | SetWindowPosFlags.SWP_NOSIZE);
    };
}

如果您的窗口调整大小,最小化或最大化,您可能需要再次调用该方法。事实上,如果它再次被激活。您还应该检查模态对话框的行为方式。