Как вы предотвращаете перемещение окон? - PullRequest
35 голосов
/ 25 мая 2009

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

Ответы [ 15 ]

67 голосов
/ 25 мая 2009

Взгляните на эту ссылку . Возможно, вас заинтересует вариант № 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);
}
26 голосов
/ 25 мая 2011

Можно установить для свойства FormBorderStyle формы значение Нет

this.FormBorderStyle=System.Windows.Forms.FormBorderStyle.None
8 голосов
/ 02 мая 2011

Я нашел это, чтобы остановить движение формы (его в c #)

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);
        }

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

2 голосов
/ 03 августа 2014
  1. Перейти к событиям формы-> Местоположение изменилось

введите следующий код

Location = new Point(this.Width,this.Height);
2 голосов
/ 25 мая 2011

Попробуйте переопределить 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);
}
2 голосов
/ 25 мая 2011

Не стоит делать вашу форму неподвижной. Я бы подумал об этом на твоем месте.
В любом случае, вы можете сделать это, переопределив 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;
}
2 голосов
/ 25 мая 2009

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

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

2 голосов
/ 25 мая 2009

Это не совсем красиво (при попытке переместить форму происходит некоторое мигание), но вы можете использовать свойство 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;
    }
}

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

1 голос
/ 05 августа 2015

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

0 голосов
/ 30 ноября 2014

Приватный саб 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...