C# 移动无边界表单

C# 移动无边界表单,c#,move,borderless,C#,Move,Borderless,我需要你的帮助,我很久以前在网上找到了一些代码。遗憾的是,我不记得它在哪里:(为了在我的项目中移动无边界表单,我使用以下代码: protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); if (e.Button == System.Windows.Forms.MouseButtons.Left) { this.Capture = f

我需要你的帮助,我很久以前在网上找到了一些代码。遗憾的是,我不记得它在哪里:(为了在我的项目中移动无边界表单,我使用以下代码:

protected override void OnMouseDown(MouseEventArgs e)
{
     base.OnMouseDown(e);
     if (e.Button == System.Windows.Forms.MouseButtons.Left)
          {
               this.Capture = false;
               Message msg = Message.Create(this.Handle, 0XA1, new IntPtr(2), IntPtr.Zero);
               this.WndProc(ref msg);
          }
}

我的问题是,我不完全理解代码是如何工作的。据我所知,当在窗体上单击鼠标按钮时,事件被激活。然后,如果鼠标单击是左键单击,则执行查询。从那里我不知道以下代码的作用:(

this.Capture=false告诉操作系统停止捕获鼠标事件。Message.Create创建一条新消息,发送到当前应用程序的消息循环。0xA1是WM_nClubuttonDown;这是一条非客户端的左下按钮消息。这意味着它模拟在缺少的边框上单击鼠标左键


然后Windows将处理剩余的过程。

您基本上是在向窗口发布消息。MSDN的一项小研究发现,您发布的消息是。基本上,您是在告诉底层窗口鼠标左键被按下,它需要对此做出响应。该响应通常是拖拉的在基本级别上,您正在向窗口发送一条消息,并让它处理它

您给它一个0xA1(WM_NCLBUTTONDOWN),并通过发送一个0x02作为参数(HTCAPTION),您愚弄了流程,使其认为您在标题栏上。拖动标题栏会移动窗口,因此您可以使用代码拖动窗口

在以下位置执行此操作的示例: