Панель задач перекрывает развернутую форму окна #c#

Мне нужно, чтобы развернутое окно располагалось поверх панели задач, сохраняя все окно над панелью задач.

Я попробовал добавить,

this.MaximizedBounds = Screen.FromHandle(this.Handle).WorkingArea;
this.MaximumSize = Screen.PrimaryScreen.WorkingArea.Size;

Также попробовал изменить TopMost на true. Но в итоге форма за панелью задач отображалась вот так.

Не могли бы вы мне помочь?

Screen.WorkingArea и Screen.Bounds
dr.null 24.06.2024 17:55

Спасибо @dr.null, не могли бы вы указать, что здесь не так?

udd_ish 25.06.2024 04:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно вашей ситуации, я провел тест. Я создал элемент управления 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, я ценю твою помощь :)

udd_ish 25.06.2024 09:11

Другие вопросы по теме

Похожие вопросы