Как обрабатывать Win + Shift + Left / Prang на Win7 с пользовательской логикой wm_getminmaxinfo?

StackOverflow https://stackoverflow.com/questions/2802886

  •  25-09-2019
  •  | 
  •  

Вопрос

У меня есть пользовательская реализация 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 + Left / Vight, сообщение WM_GETMINMAXINFO получено, как я ожидаю, но мониторингFromWindow (HWND, Monitor_Defaulttonearest) возвращает монитор, приложение только что было перемещено, а не монитор движется Чтобы, поэтому, если мониторы имеют разные резолюции, окно в конечном итоге неверно.

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

Это было полезно?

Решение

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

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

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

Как насчет использования Wm_windowsChanged сообщение? Это отправлено после Каждый раз, когда окно перемещено. Вы можете получить HWND из структуры WindowPOS и используйте, что в мониторе FromWindow Call, чтобы получить монитор. Когда последующий wm_getminmaxinfo отправляется, вы можете использовать это, как вы делаете сейчас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top