it-swarm.com.ru

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

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

34
Ozzy

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

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

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

Я нашел это, чтобы остановить движение формы (его в 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);
        }

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

8
V4Vendetta

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

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

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

2
Fredrik Mörk

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

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

2
Tommy Hui

Попробуйте переопределить 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
Reniuz
  1. Перейти к форме событий-> Место изменилось

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

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

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

1
Hamza Javed

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

0
Riftus

Частный 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
0
Manish Bhankharia

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

0
David McEwing

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

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

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

this.Locked = true;
0
Dylan Roberts

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

0
Oded