Mueva un botón de mouse derecho sin borde sin borde, posiblemente con métodos nativos
-
27-10-2019 - |
Pregunta
Tengo una situación en la que me gustaría mover un formulario de Windows manteniendo presionado el botón derecho del mouse en su área de cliente; La forma no tiene borde como he dicho.
Me gustaría moverlo "nativo" (si es posible, de lo contrario otras respuestas también están bien). Me refiero a la forma en que se comporta cuando mantienes el botón del mouse izquierdo en la barra de título (con mouse y cosas así, obtengo muchos comportamientos extraños, pero tal vez solo soy yo).
He leído muchas cosas y esta publicación parece útil.
Intenté una forma de usar eso y observé a través de http://msdn.microsoft.com/en-us/library/ff468877%28v=vs.85%29.aspx Para encontrar otras cosas útiles y Wm_ncrButtondown vino en mi mente, sin embargo, el WNDProc no lo detecta, ¿tal vez porque está manejado por la forma?
Cualquier sugerencia es apreciada, gracias
Francesco
Solución
public partial class DragForm : Form
{
// Offset from upper left of form where mouse grabbed
private Size? _mouseGrabOffset;
public DragForm()
{
InitializeComponent();
}
protected override void OnMouseDown(MouseEventArgs e)
{
if( e.Button == System.Windows.Forms.MouseButtons.Right )
_mouseGrabOffset = new Size(e.Location);
base.OnMouseDown(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
_mouseGrabOffset = null;
base.OnMouseUp(e);
}
protected override void OnMouseMove(MouseEventArgs e)
{
if (_mouseGrabOffset.HasValue)
{
this.Location = Cursor.Position - _mouseGrabOffset.Value;
}
base.OnMouseMove(e);
}
}
Otros consejos
Necesita dos métodos P/Invoke para hacer esto.
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd, int msg, int wparam, int lparam);
[DllImport("user32.dll")]
static extern bool ReleaseCapture();
Un par de constantes:
const int WmNcLButtonDown = 0xA1;
const int HtCaption= 2;
Manejar el MouseDown
Evento en su formulario, luego haga esto:
private void Form_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
ReleaseCapture();
SendMessage(this.Handle, WmNcLButtonDown, HtCaption, 0);
}
}
Esto enviará a su formulario el mismo evento que recibe cuando el mouse haga clic y mantiene presionado el área de subtítulos. Mueva el mouse y la ventana se mueve. Cuando suelta el botón del mouse, el movimiento se detiene. Muy fácil.