Asa de tamaño personalizado en forma sin bordes C #

Estoy intentando hacer formas sin bordes que salgan de una barra de herramientas. Quiero que el usuario pueda agarrar en la esquina inferior derecha (un "identificador de cambio de tamaño") y poder cambiar el tamaño del formulario, pero no poder cambiar el tamaño o la posición del formulario de ninguna otra manera.

He oído que puedo interceptar elWM_NCHITTEST mensaje enviado al formulario y establecer su resultado enHTBOTTOMRIGHT lo que permitirá al sistema operativo manejar el cambio de tamaño del formulario, como si tuviera un marco de tamaño considerable. La idea que tuve fue detectar si el puntero del mouse había entrado en un cuadro que definí en la esquina y si lo hizo, devolver elHTBOTTOMRIGHT resultado.

Esto no funciona del todo como esperaba. Puedo interceptar el mensaje, pero parece que el mensaje solo se envía cuando el usuario coloca el cursor del mouse en el borde grueso de 1px del formulario. Eso significa que funciona como quiero, si coloca el cursor de manera muy precisa en los bordes inferiores derecho.

Aquí está miWndProc anular:

protected override void WndProc(ref Message m)
{
    const UInt32 WM_NCHITTEST = 0x0084;
    const UInt32 HTBOTTOMRIGHT = 17;
    const int RESIZE_HANDLE_SIZE = 40;
    bool handled = false;
    if (m.Msg == WM_NCHITTEST)
    {
        Size formSize = this.Size;
        Point screenPoint = new Point(m.LParam.ToInt32());
        Point clientPoint = this.PointToClient(screenPoint);
        Rectangle hitBox = new Rectangle(formSize.Width - RESIZE_HANDLE_SIZE, formSize.Height - RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE);
        if (hitBox.Contains(clientPoint))
        {
            m.Result = (IntPtr)HTBOTTOMRIGHT;
            handled = true;
        }
    }

    if (!handled)
        base.WndProc(ref m);
}

¿Estoy haciendo algo mal o hay una mejor manera de hacer lo que estoy tratando de hacer?

Muchas gracias.

Respuestas a la pregunta(4)

Su respuesta a la pregunta