1

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

问题:我必须在我的代码中更改什么以设置我的窗口反对任务栏?

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>
4

1 回答 1

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);
    };
}

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

于 2012-07-30T12:31:39.283 回答