Как обработать Win + Shift + LEft / Right на Win7 с помощью собственной логики WM_GETMINMAXINFO? - PullRequest
2 голосов
/ 10 мая 2010

У меня есть пользовательская реализация Windows в приложении WPF, которое перехватывает 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 + Влево / Вправо, сообщение WM_GETMINMAXINFO принимается, как и следовало ожидать, но MonitorFromWindow (hwnd, MONITOR_DEFAULTTONEAREST) ​​возвращает монитор, из которого приложение было перемещено из, а не монитор он перемещается в TO, поэтому, если мониторы имеют разное разрешение, окно будет иметь неправильный размер.

Я не уверен, что я могу вызвать что-то еще, кроме MonitorFromWindow, или есть сообщение «движущиеся мониторы», которое я могу перехватить до WM_GETMINMAXINFO. Я предполагаю, что есть способ сделать это, потому что "нормальные" окна работают просто отлично.

1 Ответ

1 голос
/ 10 мая 2010

Согласно на странице MSDN отправляется WM_GETMINMAXINFO:

"когда размер или положение окна собирается измениться"

, который объясняет, почему ваш вызов MonitorFromWindow возвращает предыдущий монитор.

Как насчет использования сообщения WM_WINDOWPOSCHANGED ? Он отправляется после каждый раз, когда окно перемещается. Вы можете получить HWND из структуры WINDOWPOS и использовать ее в вызове MonitorFromWindow для получения монитора. Когда отправляется следующий WM_GETMINMAXINFO, вы можете использовать его, как и сейчас.

...