Como você evita que uma janela seja movida?

Como eu faria para impedir que um formulário fosse movido? Eu tenho o estilo de borda do formulário definido como FixedSingle e gostaria de mantê-lo desta forma porque parece bom no vista 🙂

Dê uma olhada neste link . Você pode estar interessado na opção # 3. Isso exigirá que você envolva algum código nativo, mas deve funcionar. Há também um comentário na parte inferior do link que mostra uma maneira mais fácil de fazer isso. Retirado do comentário (não pode ser creditado, mas vou salvar algumas pesquisas):

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

Você pode definir a propriedade FormBorderStyle do formulário para nenhum

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

Eu encontrei isso para impedir que o formulário se mova (é em 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); } 

Encontrado aqui

Não é tudo muito bonito (há algum piscar quando você tenta mover o formulário), mas você pode usar a propriedade LocationChanged para manter o formulário onde você quer:

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

Por curiosidade; Por que você quer fazer isso?

No Windows, o estilo WS_CAPTION é a área não-cliente que permite que sua janela seja movida com um mouse. Então, a maneira mais fácil de fazer o que você quer é remover esse estilo da sua janela.

No entanto, se você precisa ter uma legenda e ainda conseguir o que deseja, o próximo estilo seria capturar a mensagem WM_NCHITTEST e verificar HTCAPTION. Se o código for HTCAPTION, retorne NTNOWHERE. Isso impedirá que o procedimento de janela padrão execute a coisa da janela de movimentação padrão.

Não é uma boa prática tornar sua forma inabalável. Eu pensaria sobre isso se fosse você.
De qualquer forma, você pode fazer isso sobrescrevendo o WinProc para desabilitar o item de menu [Mover] do menu do sistema.

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

Além disso, você pode manipular o evento OnMove do seu formulário. Mas acho que isso causará alguma oscilação:

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

Tente sobrescrever o 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); } 
  1. Ir para events de formulário-> local alterado

escreva o seguinte código

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

Basta alterar a propriedade FormBorderStyle para None .

Eu questionaria sua necessidade de tornar a forma inalterável. Isso não parece legal. Você poderia, claro, salvar a localização da janela quando a janela fecha e reabrir a janela nessa posição. Isso dá ao usuário algum controle sobre onde a janela deve estar localizada.

Você pode se inscrever no evento Form.Move e reposicioná-lo.

Apenas redefina a localização no evento formlocation_changed para onde estava, ou seja, configure o Form.Location para uma variável antes de ser movida e quando o usuário tentar movê-la, ela retornará ao local da variável para a qual você a configurou.

Altere a propriedade de formulário StartPostion para manual. Em seguida, manipule o evento LocationChanged:

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

Private Sub MyFormLock () Me.Location = Novo ponto (0, 0) End Sub

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

Podes tentar:

 this.Locked = true;