我正在尝试制作从工具栏弹出的无边框表单。我希望用户能够抓住右下角(“调整大小手柄”)并能够调整表单大小,但不能以任何其他方式调整表单大小或重新定位表单。
我听说我可以拦截WM_NCHITTEST发送到表单的消息并将其结果设置为HTBOTTOMRIGHT让操作系统处理表单的大小调整,就好像它有一个相当大的框架一样。我的想法是检测鼠标指针是否进入了我在角落定义的框,如果进入则返回HTBOTTOMRIGHT结果。

这并不像我预期的那样工作。我能够截获该消息,但似乎只有当用户将鼠标光标放在表单的 1px 粗边框上时才会发送该消息。这意味着它可以按照我的意愿工作,如果您将光标非常精确地定位在右下角边缘。
这是我的WndProc覆盖:
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);
}
我做错了什么还是有更好的方法来做我想做的事情?
非常感谢。