Wpf 如何处理Win+;班次+;Win7上的左/右与自定义WM_GETMINMAXINFO逻辑?

Wpf 如何处理Win+;班次+;Win7上的左/右与自定义WM_GETMINMAXINFO逻辑?,wpf,windows-7,wndproc,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

我在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)返回应用程序刚从的监视器,而不是它移动到的监视器,因此,如果显示器的分辨率不同,则窗口的大小最终会错误

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

根据WM\u GETMINMAXINFO发送:

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

这解释了为什么调用MonitorFromWindow返回上一个监视器


使用这个消息怎么样?它在每次移动窗口后发送。您可以从WINDOWPOS结构中获取HWND,并在MonitorFromWindow调用中使用它来获取监视器。发送后续WM_GETMINMAXINFO时,您可以像现在一样使用它。

谢谢。我会把它挂起来看看-我猜我只是自己手动调整窗口大小?我尝试了这个方法,但似乎没有效果,尽管调试几乎不可能,因为来回切换到调试器会再次触发事件。无论如何,我都会接受它,因为它应该是有效的,我以后会尝试花更多的时间在它上面。谢谢