代码之家  ›  专栏  ›  技术社区  ›  Steven Robbins

如何使用自定义的wm_GetMinMaxInfo逻辑处理win7上的win+shift+left/right?

  •  2
  • Steven Robbins  · 技术社区  · 14 年前

    我在一个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_etminmaxinfo消息,如我所料,但monitorFromWindow(hwnd,monitor_elttonearest)会返回刚移动应用程序的监视器,而不是移动到的监视器,因此,如果监视器的分辨率不同,窗口的大小就会出错。

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

    1 回复  |  直到 14 年前
        1
  •  1
  •   voyce    14 年前

    根据 the MSDN page wm_getminmaxinfo发送:

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

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

    用这个怎么样 WM_WINDOWPOSCHANGED 消息?它被发送了 之后 每次移动窗口时。您可以从windowpos结构中获取hwnd,并在monitorFromWindow调用中使用它来获取监视器。当随后的wm_GetMinMaxInfo被发送时,您可以像现在一样使用它。