Подтвердить что ты не робот

Как предотвратить перемещение окон?

Как я могу остановить остановку формы. У меня есть стиль рамки формы, заданный как FixedSingle, и хотелось бы сохранить его таким образом, потому что он выглядит хорошо в Vista:

4b9b3361

Ответ 1

Посмотрите на ссылку . Вам может быть интересна опция №3. Это потребует, чтобы вы обернули некоторый собственный код, но должны работать. Там также есть комментарий внизу ссылки, который показывает более простой способ сделать это. Взято из комментария (не беру на себя ответственность за это, но я сохраню вам некоторые поиски):

protected override void WndProc(ref Message message)
{
    const int WM_SYSCOMMAND = 0x0112;
    const int SC_MOVE = 0xF010;

    switch(message.Msg)
    {
        case WM_SYSCOMMAND:
           int command = message.WParam.ToInt32() & 0xfff0;
           if (command == SC_MOVE)
              return;
           break;
    }

    base.WndProc(ref message);
}

Ответ 2

Вы можете установить свойство FormBorderStyle формы на None

this.FormBorderStyle=System.Windows.Forms.FormBorderStyle.None

Ответ 3

Я нашел это, чтобы остановить форму от перемещения (ее в С#)

protected override void WndProc(ref Message m)
        {
            const int WM_SYSCOMMAND = 0x0112;
            const int SC_MOVE = 0xF010;

            switch (m.Msg)
            {
                case WM_SYSCOMMAND:
                    int command = m.WParam.ToInt32() & 0xfff0;
                    if (command == SC_MOVE)
                        return;
                    break;
            }
            base.WndProc(ref m);
        }

Найдено здесь

Ответ 4

Это не все красиво (происходит некоторая проблеска, когда вы пытаетесь переместить форму), но вы можете использовать свойство LocationChanged, чтобы сохранить форму там, где вы хотите:

private Point _desiredLocation;
// assign the _desiredLocation variable with the form location at some
// point in the code where you know that the form is in the "correct" position


private void Form_LocationChanged(object sender, EventArgs e)
{
    if (this.Location != _desiredLocation)
    {
        this.Location = _desiredLocation;
    }
}

Из любопытства; зачем вы хотите это сделать?

Ответ 5

В Windows стиль WS_CAPTION - это неклиентская область, которая позволяет перемещать ваше окно с помощью мыши. Таким образом, самый простой способ сделать то, что вы хотите, - удалить этот стиль из своего окна.

Однако, если вам нужно иметь подпись и по-прежнему достичь того, чего вы хотите, следующий стиль будет состоять в том, чтобы захватить сообщение WM_NCHITTEST и проверить наличие HTCAPTION. Если код HTCAPTION, верните NTNOWHERE вместо этого. Это предотвратит выполнение оконной процедурой по умолчанию по умолчанию.

Ответ 6

Это не очень хорошая практика, чтобы сделать вашу форму неподвижной. Я бы подумал об этом, если бы был вами. В любом случае, вы можете сделать это, переопределив WinProc, чтобы отключить элемент меню [Move] из системного меню.

[DllImport("user32.dll")]
private static extern Int32 EnableMenuItem ( System.IntPtr hMenu , Int32uIDEnableItem, Int32 uEnable);  
private const Int32 HTCAPTION = 0×00000002;  
private const Int32 MF_BYCOMMAND =0×00000000;  
private const Int32 MF_ENABLED =0×00000000;  
private const Int32 MF_GRAYED =0×00000001;  
private const Int32 MF_DISABLED =0×00000002; 
private const Int32 SC_MOVE = 0xF010; 
private const Int32 WM_NCLBUTTONDOWN = 0xA1;
private const Int32 WM_SYSCOMMAND = 0×112;
private const Int32 WM_INITMENUPOPUP = 0×117;

protected override void WndProc(ref System.Windows.Forms.Message m )
{
if (m.Msg == WM_INITMENUPOPUP)
{
    //handles popup of system menu
    if ((m.LParam.ToInt32() / 65536) != 0) // 'divide by 65536 to get hiword
    {
        Int32 AbleFlags = MF_ENABLED;
        if (!Moveable)
        {
            AbleFlags = MF_DISABLED | MF_GRAYED; // disable the move
        }
        EnableMenuItem(m.WParam, SC_MOVE, MF_BYCOMMAND | AbleFlags);
    }
}
if (!Moveable)
{
    if (m.Msg == WM_NCLBUTTONDOWN) //cancels the drag this is IMP
    {
        if (m.WParam.ToInt32() == HTCAPTION) return;
    }
    if (m.Msg == WM_SYSCOMMAND) // Cancels any clicks on move menu
    {
        if ((m.WParam.ToInt32() & 0xFFF0) == SC_MOVE) return;
    }
}
base.WndProc(ref m);
}  

Кроме того, вы можете обрабатывать событие OnMove вашей формы. Но я думаю, что это вызовет некоторое мерцание:

private void Form1_Move(object sender, EventArgs e)
{
    this.Location = defaultLocation;
}

Ответ 7

Попробуйте переопределить WndProc:

protected override void WndProc(ref Message m)
{
   const int WM_NCLBUTTONDOWN = 161;
   const int WM_SYSCOMMAND = 274;
   const int HTCAPTION = 2;
   const int SC_MOVE = 61456;

   if ((m.Msg == WM_SYSCOMMAND) && (m.WParam.ToInt32() == SC_MOVE))
   {
       return;
   }

   if ((m.Msg == WM_NCLBUTTONDOWN) && (m.WParam.ToInt32() == HTCAPTION))
   {
       return;
   }

   base.WndProc(ref m);
}

Ответ 8

  • Перейдите к форме events- > Location changed

напишите следующий код

Location = new Point(this.Width,this.Height);

Ответ 9

Я бы поставил под сомнение вашу потребность сделать форму неподвижной. Это звучит не очень хорошо. Конечно, вы можете сохранить местоположение окна, когда окно закроется и снова откроет окно в эту позицию. Это дает пользователю некоторый контроль над тем, где должно располагаться окно.

Ответ 10

Вы можете попробовать:

this.Locked = true;

Ответ 11

Вы можете подписаться на Form.Move событие и изменить его.

Ответ 12

Просто reset местоположение в событии formlocation_changed, где оно было, т.е. установите для параметра Form.Location значение переменной перед его перемещением и когда пользователь попытается переместить его, он вернется к месту переменной, в которое вы его установили.

Ответ 13

измените свойство Form StartPostion на Manual. Затем обработайте событие LocationChanged:

private void frmMain_LocationChanged(object sender, EventArgs e)
{
Location = new Point(0, 0);
}

Ответ 14

Частный Sub MyFormLock()       Me.Location = Новая точка (0, 0)   End Sub

Private Sub SearchSDR_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
    Call MyFormLock()
End Sub

Ответ 15

Просто измените свойство FormBorderStyle на None.