Как обрабатывать Win + Shift + Left / Prang на Win7 с пользовательской логикой wm_getminmaxinfo?
Вопрос
У меня есть пользовательская реализация 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 отправляется, вы можете использовать это, как вы делаете сейчас.