2012-07-28 60 views
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> 
+1

您是否嘗試過[this](http://stackoverflow.com/questions/11402570/wpf-window-in-front-of-taskbar-using-dual-monitor-how-can-i-do-it) – dowhilefor 2012-07-28 20:10:16

+1

我看到了它,但它並沒有幫助我......就像在問題中重複的那樣:當我點擊另一個窗口時,任務欄會進入頂端......請幫助,如果可以的話。 – 2012-07-30 11:46:09

+0

是否將Windows任務欄配置爲「不是最高級」可用作解決方案? – kenny 2012-07-30 13:47:25

回答

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

如果您的窗口被調整大小,最小化或最大化,您可能需要再次調用該方法。事實上,如果它再次被激活。你也應該檢查它與Modal對話框的行爲。

+0

我將你的代碼集成到了我的代碼中。沒有錯誤。問題是一樣的:當我點擊另一個窗口時,我的WPF窗口不會保留在頂部(在任務欄的前面),但代碼爲+1。如果你能解決我的問題,我會標記它。 :) – 2012-07-30 12:53:40

+0

@John很好,在一個點上,你根本無法再使一個停用的窗口最頂層。任務欄和窗口現在都是最頂層的,如果停用的窗口仍然保持最高狀態,那麼這將成爲可用性災難。所以微軟決定將訂單分成兩組(簡單地說)。 「正常」窗口,焦點決定誰在頂層,所有頂層窗口中焦點決定哪個頂層窗口現在是最頂層。沒有什麼特別的方法可以使窗戶成爲最頂層的。 – dowhilefor 2012-07-30 13:11:50

+0

好的,謝謝你的反饋。但是,http://join.me應用程序如何保持橙色矩形的頂部(也在任務欄前)? – 2012-07-30 13:15:18