Мне нужно, чтобы развернутое окно располагалось поверх панели задач, сохраняя все окно над панелью задач.
Я попробовал добавить,
this.MaximizedBounds = Screen.FromHandle(this.Handle).WorkingArea;
this.MaximumSize = Screen.PrimaryScreen.WorkingArea.Size;
Также попробовал изменить TopMost на true. Но в итоге форма за панелью задач отображалась вот так.
Не могли бы вы мне помочь?
Спасибо @dr.null, не могли бы вы указать, что здесь не так?
Согласно вашей ситуации, я провел тест. Я создал элемент управления StatusStrip внизу формы и добавил в него StatusLabel, чтобы проверить, развернута ли форма, и вверху панели задач после запуска:
Примеры кода, использованные в тесте, следующие:
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// Maximize the window when the form loads
this.WindowState = FormWindowState.Maximized;
// Set the borders of the maximized window to avoid covering the taskbar
this.MaximizedBounds = Screen.FromHandle(this.Handle).WorkingArea;
}
protected override void WndProc(ref Message m)
{
const int WM_GETMINMAXINFO = 0x0024;
if (m.Msg == WM_GETMINMAXINFO)
{
IntPtr monitor = MonitorFromWindow(this.Handle, MONITOR_DEFAULTTONEAREST);
if (monitor != IntPtr.Zero)
{
// Get the MINMAXINFO structure
var mmi = Marshal.PtrToStructure<MINMAXINFO>(m.LParam);
// Get monitor information
var monitorInfo = new MONITORINFO { cbSize = Marshal.SizeOf<MONITORINFO>() };
GetMonitorInfo(monitor, ref monitorInfo);
var rcWorkArea = monitorInfo.rcWork;
var rcMonitorArea = monitorInfo.rcMonitor;
// Set the size and position of the maximized window to avoid covering the taskbar
mmi.ptMaxPosition.x = rcWorkArea.Left - rcMonitorArea.Left;
mmi.ptMaxPosition.y = rcWorkArea.Top - rcMonitorArea.Top;
mmi.ptMaxSize.x = rcWorkArea.Width;
mmi.ptMaxSize.y = rcWorkArea.Height;
//Copy the modified MINMAXINFO structure back to memory
Marshal.StructureToPtr(mmi, m.LParam, true);
}
}
base.WndProc(ref m);
}
[StructLayout(LayoutKind.Sequential)]
private struct POINT
{
public int x;
public int y;
}
[StructLayout(LayoutKind.Sequential)]
private struct MINMAXINFO
{
public POINT ptReserved;
public POINT ptMaxSize;
public POINT ptMaxPosition;
public POINT ptMinTrackSize;
public POINT ptMaxTrackSize;
}
private const int MONITOR_DEFAULTTONEAREST = 0x00000002;
[DllImport("user32.dll", SetLastError = true)]
private static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFO lpmi);
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr MonitorFromWindow(IntPtr hwnd, int dwFlags);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
private struct MONITORINFO
{
public int cbSize;
public Rectangle rcMonitor;
public Rectangle rcWork;
public int dwFlags;
}
}
}
Как это выглядит после запуска:
Вы можете создать новое приложение Windows Forms и использовать приведенный выше код, чтобы протестировать его и убедиться, что оно соответствует вашим потребностям. Если применимо, вы можете соответствующим образом изменить свой код на основе приведенных выше примеров.
Спасибо @Cody, я ценю твою помощь :)