2013-08-04 71 views
3

我已經使用Microsoft.Windows.Shell DLL和.NET 4.0在WPF中創建了一個自定義窗口。阻止最大化的WPF窗口覆蓋任務欄

問題是,如果任務欄設置爲自動隱藏並且窗口最大化,那麼窗口將完全覆蓋任務欄。我嘗試了幾種不同的解決方案(前幾個谷歌搜索結果),但沒有一個真正起作用。

如果任務欄是而不是自動隱藏,則使用包MahApps.Metro的方法將在屏幕底部設置窗口1px。

我需要一個解決方案,

  1. 作品在.NET 4.0中
  2. 作品無論哪一方面的任務欄停靠到
  3. 廠當任務欄被設置爲兩個始終顯示和自動隱藏。
+0

你怎麼最大化窗口?我一直認爲「最大化」狀態考慮了工具欄(以及它的行爲)。 – ChrisF

+0

在WPF中,使用自定義窗口,當WindowState設置爲WindowState.Maximized時,渲染系統完全忽略自動隱藏的任務欄。 –

+0

我之前也有過這個。對於定製的窗口來尊重任務欄,您必須使用Win32 API來查找任務欄。 –

回答

2

自定義WPF窗口不尊重任務欄佔用的區域。爲了做到這一點,您需要從Win32 API獲得支持。

你需要的第一種方法是...

[DllImport("user32.dll")] 
    public static extern IntPtr MonitorFromWindow(IntPtr hwnd, int dwFlags); 

的MonitorFromWindow函數檢索句柄與指定窗口的邊框相交面積最大的顯示器。 http://msdn.microsoft.com/en-us/library/windows/desktop/dd145064(v=vs.85).aspx

集的dwFlags = 2

下一個是...

[DllImport("user32.dll")] 
    public static extern bool GetMonitorInfo(HandleRef hmonitor, 
         [In, Out] MonitorInfoEx monitorInfo); 

的GetMonitorInfo函數檢索有關的顯示監視器的信息。 http://msdn.microsoft.com/en-us/library/windows/desktop/dd144901(v=vs.85).aspx

的MonitorInfoEx結構看起來像...

[StructLayout(LayoutKind.Sequential)] 
    public class MonitorInfoEx 
    { 
     public int cbSize; 
     public Rect rcMonitor;  
     public Rect rcWork;   
     public int dwFlags; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x20)] 
     public char[] szDevice; 
    } 

的MONITORINFOEX結構包含顯示器的信息。 http://msdn.microsoft.com/en-us/library/windows/desktop/dd145066(v=vs.85).aspx

傳遞矩形是...

[StructLayout(LayoutKind.Sequential)] 
    public struct Rect 
    { 
     public int Left; 
     public int Top; 
     public int Right; 
     public int Bottom; 
    } 

這裏特別令人感興趣的是,你在其當前的分辨率讓工作區中DPI。

最後,你需要從PresentationCore(WPF)的互操作命名空間

一旦你把所有的信息放在一起,你可以使用CompositionTarget.TransformFromDevice到HwndSource.FromHwnd方法...獲取矩陣,可用於將渲染目標設備的座標轉換爲此目標。 http://msdn.microsoft.com/en-us/library/system.windows.media.compositiontarget.transformfromdevice.aspx

...這將給你需要的尺寸來定位你的自定義窗口,使其尊重狀態欄。

+0

如何將此與最大化的窗口一起使用?我是否需要重寫最大化呼叫以保持窗口處於正常狀態? –

+0

是的,類似的東西。跟蹤窗口狀態,並在更改時進行干預。你現在擁有你需要的所有東西。 –

+0

好的。我已經試過這樣做,並提出了以下問題:http://stackoverflow.com/questions/18047362/window-caption-render-issues。我想我正在尋找一些像Visual Studio和Office一樣可以在窗口最大化時工作的東西。 –

相關問題