C# 用鼠标拖动无边框窗口窗体

C# 用鼠标拖动无边框窗口窗体,c#,winforms,drag,C#,Winforms,Drag,可能重复: 我通过设置 this.FormBorderStyle=FormBorderStyle.None 现在,问题是如何用鼠标拖动它?您必须注册MouseDown、MouseUp和MouseMove事件,并根据鼠标的移动来移动窗体。这应该是您正在寻找的 正如博文所说,这是一种“愚弄”系统的方式。这样,您就不必考虑鼠标上/下事件。请记住,作为一种副作用,双击窗口会使窗口最大化。不会导致这个问题。我可以只在某些部分拖动它吗?使用控制区域也会杀死鼠标右键。对不起,这是一个可怕的解决方案。它终止了

可能重复:

我通过设置

this.FormBorderStyle=FormBorderStyle.None


现在,问题是如何用鼠标拖动它?

您必须注册MouseDown、MouseUp和MouseMove事件,并根据鼠标的移动来移动窗体。

这应该是您正在寻找的


正如博文所说,这是一种“愚弄”系统的方式。这样,您就不必考虑鼠标上/下事件。

请记住,作为一种副作用,双击窗口会使窗口最大化。不会导致这个问题。我可以只在某些部分拖动它吗?使用控制区域也会杀死鼠标右键。对不起,这是一个可怕的解决方案。它终止了右键单击,双击表单上的任意位置可使其最大化。。。这已经比它的价值更麻烦了-当你完成修复最大化和右键点击杀手问题时,可能已经实现了mouseDown/mouseUp和mouseMove事件。仅供参考,答案中的链接已失效-“jachman.wordpress.com不再可用。作者已删除此网站。”如果有一个代码示例,这个答案会更有价值。基于鼠标坐标移动表单的数学不是很简单。
public partial class MyDraggableForm : Form
{
    private const int WM_NCHITTEST = 0x84;
    private const int HTCLIENT = 0x1;
    private const int HTCAPTION = 0x2;

    ///
    /// Handling the window messages
    ///
    protected override void WndProc(ref Message message)
    {
        base.WndProc(ref message);

        if (message.Msg == WM_NCHITTEST && (int)message.Result == HTCLIENT)
            message.Result = (IntPtr)HTCAPTION;
    }
    public MyDraggableForm()
    {
        InitializeComponent();
    }
}