Суть вопроса такова: хочу сделать как в некоторых программах - при перемещении окна к краю монитора, форма должна примагничиваться к краю монитора. Как такое реализовывается? Примеры: аимп плеер, клиент стим. Там когда подводишь форму к краю, она примагничивается к краям. Подскажите пожалуйста как такое реализовать.
Прилипание с возможностью задвигать окно за экран:
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);
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Я сделал проект в VS 2015, использующий SQLite базу данныхУстановил расширение Costura
Есть у меня некий ListCollectionViewВ котором содержится, естественно, ObservableCollection, содержащий некоторые объекты
Добрый день, можете помочь разобраться с cefsharp, дело вот в чем :
Моя программа на Unity3D работает с MSSQL-базойОС - Windows 10