2

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

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);
          }
}

我的问题是我不完全理解代码是如何工作的。据我了解,当在表单上单击鼠标按钮时,事件会被激活。然后跟随查询,如果鼠标单击是左键单击。从那里我不知道下面的代码做了什么:(

4

3 回答 3

2

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

然后,Windows 将执行该过程的其余部分。

于 2015-05-18T17:24:17.450 回答
1

在基本层面上,您正在向您的窗口发送一条消息并让它处理它。

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

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

C#:如何从窗体及其控件中拖动一个?

http://www.catch22.net/tuts/win32-tips-tricks

于 2015-05-18T17:26:02.697 回答
0

您基本上是在向窗口发布消息。一点 MSDN 研究发现您发布的消息是WM_NCLBUTTONDOWN。基本上,您是在告诉底层窗口鼠标左键被按住并且它需要对此做出响应。该响应通常恰好是拖动窗口。

于 2015-05-18T17:24:47.153 回答