Прикрепление окна к краю монитора c#

484
07 июня 2017, 01:22

Суть вопроса такова: хочу сделать как в некоторых программах - при перемещении окна к краю монитора, форма должна примагничиваться к краю монитора. Как такое реализовывается? Примеры: аимп плеер, клиент стим. Там когда подводишь форму к краю, она примагничивается к краям. Подскажите пожалуйста как такое реализовать.

Answer 1

Прилипание с возможностью задвигать окно за экран:

protected override void WndProc(ref Message m)
{
    if (m.Msg == 0x0046 /* WM_WINDOWPOSCHANGING */)
    {
        Rectangle workArea = SystemInformation.WorkingArea;
        Rectangle rect = (Rectangle)Marshal.PtrToStructure((IntPtr)(IntPtr.Size * 2 + m.LParam.ToInt64()), typeof(Rectangle));
        var DISTANCE = 0;
        if (rect.X <= workArea.Left + DISTANCE)
                Marshal.WriteInt32(m.LParam, IntPtr.Size * 2/*, workArea.Left*/);
        if (rect.X + rect.Width >= workArea.Width - DISTANCE)
                Marshal.WriteInt32(m.LParam, IntPtr.Size * 2/*, workArea.Right - rect.Width*/);
        if (rect.Y <= workArea.Top + DISTANCE)
                Marshal.WriteInt32(m.LParam, IntPtr.Size * 2 + 4/*, workArea.Top*/);
        if (rect.Y + rect.Height >= workArea.Height - DISTANCE)
                Marshal.WriteInt32(m.LParam, IntPtr.Size * 2 + 4/*, workArea.Bottom - rect.Height*/);
        }
        base.WndProc(ref m);
    }
}

Прилипание окна к краю экрана без задвигания окна за экран

protected override void WndProc ( ref Message m ) {
    if (m.Msg == 0x0046 /* WM_WINDOWPOSCHANGING */) {
        Rectangle workArea = SystemInformation.WorkingArea;
        Rectangle rect = (Rectangle)Marshal.PtrToStructure((IntPtr)(IntPtr.Size * 2 + m.LParam.ToInt64()), typeof(Rectangle));
        if (rect.X <= workArea.Left + DISTANCE)
            Marshal.WriteInt32(m.LParam, IntPtr.Size * 2, workArea.Left);
        if (rect.X + rect.Width >= workArea.Width - DISTANCE)
            Marshal.WriteInt32(m.LParam, IntPtr.Size * 2, workArea.Right - rect.Width);
        if (rect.Y <= workArea.Top + DISTANCE)
            Marshal.WriteInt32(m.LParam, IntPtr.Size * 2 + 4, workArea.Top);
        if (rect.Y + rect.Height >= workArea.Height - DISTANCE)
            Marshal.WriteInt32(m.LParam, IntPtr.Size * 2 + 4, workArea.Bottom - rect.Height);
    }
    base.WndProc(ref m);
}

Или Привязка окна приложения к краям экрана и блокировка его перемещения

private int width = Screen.PrimaryScreen.Bounds.Width;
const int WM_NCLBUTTONDOWN = 0x00A1;
const int WM_NCHITTEST = 0x0084;
const int HTCAPTION = 2;
[DllImport("User32.dll")]
static extern int SendMessage(IntPtr hWnd,
int Msg, IntPtr wParam, IntPtr lParam);
protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_NCLBUTTONDOWN)
    {
        int result = SendMessage(m.HWnd, WM_NCHITTEST, IntPtr.Zero, m.LParam);
        if (result == HTCAPTION)
            return;
    }
    base.WndProc(ref m);
}

Для закрепления формы на краю экрана, необходимо указать при запуске формы, расположение вашего приложения:

private void Form1_Load(object sender, EventArgs e)
{
    //привязка формы к определенному месту экрана
    //верх правого угла экрана
    this.Location = new System.Drawing.Point(width - this.Size.Width, 0);
}
READ ALSO
Как подключиться к БД, зашитой в .exe файл?

Как подключиться к БД, зашитой в .exe файл?

Я сделал проект в VS 2015, использующий SQLite базу данныхУстановил расширение Costura

332
Мультифильтрование ListCollectionView

Мультифильтрование ListCollectionView

Есть у меня некий ListCollectionViewВ котором содержится, естественно, ObservableCollection, содержащий некоторые объекты

292
cefsharp отключить webrtc c#

cefsharp отключить webrtc c#

Добрый день, можете помочь разобраться с cefsharp, дело вот в чем :

505
Unity3D/C# + MSSQL: ошибка открытия соединения

Unity3D/C# + MSSQL: ошибка открытия соединения

Моя программа на Unity3D работает с MSSQL-базойОС - Windows 10

367