¿Cómo se evita que se mueva una ventana?

¿Cómo puedo evitar que se mueva un formulario? Tengo el estilo de borde de formulario establecido como FixedSingle y me gustaría mantenerlo así porque se ve bien en vista 🙂

Eche un vistazo a este enlace . Es posible que le interese la opción n. ° 3. Te requerirá que envuelvas un código nativo, pero debería funcionar. También hay un comentario en la parte inferior del enlace que muestra una forma más fácil de hacerlo. Tomado del comentario (no se puede atribuir el mérito, pero le ahorraré algunas búsquedas):

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

Puede establecer la propiedad FormBorderStyle del Formulario en Ninguno

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

Encontré esto para evitar que la forma se mueva (está en 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 aquí

No todo es bonito (hay algunos destellos cuando intenta mover el formulario), pero puede usar la propiedad LocationChanged para mantener el formulario donde lo desea:

 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 curiosidad; ¿Por qué querrías hacer esto?

En Windows, el estilo WS_CAPTION es el área no cliente que permite que su ventana se mueva con un mouse. Entonces, la manera más fácil de hacer lo que desea es eliminar este estilo de su ventana.

Sin embargo, si necesita tener un título y aún así lograr lo que desea, entonces el siguiente estilo sería capturar el mensaje WM_NCHITTEST y verificar que no tenga HTCAPTION. Si el código es HTCAPTION, regrese NTNOWHERE en su lugar. Esto evitará que el procedimiento de ventana predeterminado ejecute la operación predeterminada mover ventana.

No es una buena práctica hacer que tu forma sea inamovible. Pensaría en ello si fuera tú.
De todos modos, puede hacer esto anulando el WinProc para deshabilitar el elemento de menú [Mover] del menú del 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); } 

Además, puede manejar el evento OnMove de su formulario. Pero creo que esto causará cierto parpadeo:

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

Intenta anular 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 a los eventos-> Ubicación cambiada

escribe el siguiente código

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

Simplemente cambie la propiedad FormBorderStyle a None .

Yo cuestionaría tu necesidad de hacer que la forma no se pueda mover. Esto no suena bien. Por supuesto, puede guardar la ubicación de la ventana cuando la ventana se cierre y vuelva a abrir la ventana en esa posición. Eso le da al usuario cierto control sobre dónde debe ubicarse la ventana.

Puede suscribirse al evento Form.Move y reposicionarlo.

Simplemente restablezca la ubicación en el evento formlocation_changed a donde estaba, es decir, establezca el Form.Location en una variable antes de que se mueva y cuando el usuario intente moverlo, volverá a la ubicación de la variable en la que lo configuró.

cambie la propiedad Formulario StartPostion a Manual. A continuación, gestione el evento LocationChanged:

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

Private Sub MyFormLock () Me.Location = Nuevo punto (0, 0) End Sub

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

Puedes probar:

 this.Locked = true;