Окно C# WPF больше экрана при максимальном увеличенииC#

Место общения программистов C#
Ответить
Anonymous
 Окно C# WPF больше экрана при максимальном увеличении

Сообщение Anonymous »

ПОЖАЛУЙСТА, НЕ ПОМЕЧАЙТЕ КАК ДУБЛИКАТ! Я нашел соответствующие вопросы по Stackoverflow, но они не сработали.
Я создаю окно с WindowStyle="None" AllowTransparency="True" . Поэтому я пытаюсь создать полностью собственное окно. Я пытался заставить работать с ним функции Windows, такие как панель макета, изменение анимированного состояния.
Я нашел этот ответ:

Код: Выделить всё

public void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (this.WindowState == WindowState.Maximized)
{
this.BorderThickness = new System.Windows.Thickness(8);
}
else
{
this.BorderThickness = new System.Windows.Thickness(0);
}
}
Хотя это неплохо, я хотел бы решить основную проблему, если смогу. Это потому, что я предполагаю, что это будет исправлено, и не хочу менять все обратно в каждом из моих приложений. Кроме того, я не знаю, связана ли эта проблема с Win 11 или с другими версиями.
Также я нашел этот ответ:

Код: Выделить всё

IntPtr myStyle = new IntPtr(WS.WS_CAPTION | WS.WS_CLIPCHILDREN | WS.WS_MINIMIZEBOX | WS.WS_SYSMENU | WS.WS_SIZEBOX | WS.WS_MAXIMIZEBOX); // ADD  "| WS.WS_MAXIMIZEBOX " to enable snap bar
SetWindowLongPtr(new HandleRef(null, handle), GWL_STYLE, myStyle);
Это все хорошо, но когда я добавляю WS.WS_MAXIMIZEBOX в myStyle, то если я максимизирую окно, оно будет на 8 пикселей больше, чем экран (без панели задач). Теперь я предполагаю, что много искал и не смог найти рабочего ответа. В большинстве мест этот ответ работал (не для меня):

Код: Выделить всё

private void WindowLoaded(object sender, RoutedEventArgs e)
{
handle = new WindowInteropHelper(window).Handle;
HwndSource.FromHwnd(handle).AddHook(new HwndSourceHook(WindowProc));

IntPtr myStyle = new IntPtr(WS.WS_CAPTION | WS.WS_CLIPCHILDREN | WS.WS_MINIMIZEBOX | WS.WS_SYSMENU | WS.WS_SIZEBOX | WS.WS_MAXIMIZEBOX); // ADD  "| WS.WS_MAXIMIZEBOX " to enable snap bar
SetWindowLongPtr(new HandleRef(null, handle), GWL_STYLE, myStyle);
}

private static IntPtr WindowProc(
System.IntPtr hwnd,
int msg,
System.IntPtr wParam,
System.IntPtr lParam,
ref bool handled)
{
switch (msg)
{
case 0x0024:/* WM_GETMINMAXINFO */
WmGetMinMaxInfo(hwnd, lParam);
handled = true;
break;
}
return (IntPtr)0;
}

public static void WmGetMinMaxInfo(IntPtr hwnd, IntPtr lParam)
{
MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO));
int MONITOR_DEFAULTTONEAREST = 0x00000002;
IntPtr monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);

if (monitor != 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) // + 1;
mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.top - rcMonitorArea.top) // + 1;
mmi.ptMaxSize.x = Math.Abs(rcWorkArea.right - rcWorkArea.left) // - 1;
mmi.ptMaxSize.y = Math.Abs(rcWorkArea.bottom - rcWorkArea.top) // - 1;
}
Marshal.StructureToPtr(mmi, lParam, true);
}
Поэтому, когда я удаляю стиль WS.WS_MAXIMIZEBOX, он работает.
Но он мне нужен для панели привязки.
Поэтому, когда я добавляю его, он ТОЛЬКО работает, если я тоже

Код: Выделить всё

mmi.ptMaxSize.y = Math.Abs(rcWorkArea.bottom - rcWorkArea.top) - {number here > 0};
mmi.ptMaxSize.x = Math.Abs(rcWorkArea.bottom - rcWorkArea.top) - {number here > 0};
или

Код: Выделить всё

mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.top - rcMonitorArea.top) + {number here > 0};
mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.top - rcMonitorArea.top) + {number here > 0};
Это работает, если я делаю что-либо из вышеперечисленного. Но если получится, я бы не хотел создавать разрыв в пикселях ни с одной из сторон.
Поэтому я здесь ищу помощи. Как я могу заставить его работать без пробелов?

Подробнее здесь: https://stackoverflow.com/questions/788 ... -maximized
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»