2013-08-04 1 views
3

Microsoft.Windows.Shell DLL 및 .NET 4.0을 사용하여 WPF에서 사용자 지정 창을 만들었습니다.최대 WPF 창에서 작업 표시 줄 덮지 않음

문제는 작업 표시 줄이 자동 숨김으로 설정되고 창이 최대화되면 창에 작업 표시 줄이 완전히 덮여 있다는 것입니다. 몇 가지 다른 솔루션 (처음 몇 가지 Google 결과)을 시도했지만 아무도 실제로 작동하지 않습니다.

MahApps.Metro 패키지가 사용하는 방법은 작업 표시 줄이 이 아닌 자동 숨김 인 경우 화면 하단에서 1px 떨어진 창을 설정합니다.

은 내가 작업 표시 줄이 모두로 설정되어있을 때 작업 표시 줄이

  • 작품에 도킹 측면에 상관없이 .NET 4.0
  • 작품에서

    1. 작품이 항상 표시 솔루션 및 자동 숨기기가 필요합니다.
  • +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의 작업 영역을 받고 있다는 점이다.

    마지막으로, 당신은 당신이 함께 모든 정보가 있으면, 당신은 CompositionTarget.TransformFromDevice로 사용할 수 있습니다

    PresentationCore (WPF)의 상호 운용성 네임 스페이스에서 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와 같이 창을 실제로 최대화 할 때 사용할 수있는 것을 찾고 있다고 생각합니다. –