我的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>
答案 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);
};
}
如果您的窗口调整大小,最小化或最大化,您可能需要再次调用该方法。事实上,如果它再次被激活。您还应该检查模态对话框的行为方式。