如何使用自定义WM_GETMINMAXINFO逻辑在Win7上处理Win + Shift + LEft / Right?

时间:2010-05-10 13:20:50

标签: wpf windows-7 wndproc

我在WPF应用程序中有一个自定义的Windows实现,它挂钩WM_GETMINMAXINFO,如下所示:

    private void MaximiseWithTaskbar(System.IntPtr hwnd, System.IntPtr lParam)
    {
        MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO));

        System.IntPtr monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);

        if (monitor != System.IntPtr.Zero)
        {
            MONITORINFO monitorInfo = new MONITORINFO();
            GetMonitorInfo(monitor, monitorInfo);
            RECT rcWorkArea = monitorInfo.rcWork;
            RECT rcMonitorArea = monitorInfo.rcMonitor;
            mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.left - rcMonitorArea.left);
            mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.top - rcMonitorArea.top);
            mmi.ptMaxSize.x = Math.Abs(rcWorkArea.right - rcWorkArea.left);
            mmi.ptMaxSize.y = Math.Abs(rcWorkArea.bottom - rcWorkArea.top);
            mmi.ptMinTrackSize.x = Convert.ToInt16(this.MinWidth * (desktopDpiX / 96));
            mmi.ptMinTrackSize.y = Convert.ToInt16(this.MinHeight * (desktopDpiY / 96));
        }

        Marshal.StructureToPtr(mmi, lParam, true);
    }

这一切都很有效,它允许我最大限度地使用无边界窗口,而不必坐在任务栏上,这很棒,但它真的不喜欢用新的Win7键盘快捷键在显示器之间移动。

每当使用Win + Shift + Left / Right移动应用程序时,收到WM_GETMINMAXINFO消息,正如我所期望的那样,但是MonitorFromWindow(hwnd,MONITOR_DEFAULTTONEAREST)返回应用程序刚刚被移动的监视器,而不是监视器它正在移动TO,因此如果监视器具有不同的分辨率,则窗口的大小会错误。

我不确定是否还有其他我可以调用的东西,除了MonitorFromWindow,或者是否有一个“移动监视器”消息我可以在WM_GETMINMAXINFO之前挂钩。我假设有一种方法可以做到这一点因为“正常”的窗口工作正常。

1 个答案:

答案 0 :(得分:1)

根据the MSDN page发送WM_GETMINMAXINFO:

  

“当窗口的大小或位置即将改变时”

这解释了为什么您对MonitorFromWindow的调用会返回上一个监视器。

如何使用WM_WINDOWPOSCHANGED消息?每次移动窗口时都会在之后发送。您可以从WINDOWPOS结构获取HWND,并在MonitorFromWindow调用中使用它来获取监视器。当发送后续WM_GETMINMAXINFO时,您可以像现在一样使用它。