现在许多程序(Windows Media Player, QQ等)都能通过点击窗体的任意一部分实现拖动整个窗体,下面介绍一个用P/Invoke来实现的方法.
因为要使用P/Invoke,首先引入
using System.Runtime.InteropServices;
定义Win32 API常量字段
public const int WM_NCLBUTTONDOWN = 0xA1; //消息:左键点击
public const int HT_CAPTION = 0x2; //标题栏
引入Win32 API函数
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); //发送消息
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture(); //释放鼠标捕捉
给窗体加入MouseDown事件方法
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture(); //释放鼠标捕捉
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); //发送左键点击的消息至该窗体(标题栏)
}
}
其实这个方法就是通过Win32API转移鼠标的焦点来实现.
还有一个方法就是通过MouseDown,MouseMove,MouseUp事件计算坐标来实现,但是这样的效率肯定是不如P/Invoke高的.
原文地址:http://www.codeproject.com/csharp/csharpmovewindow.asp?df=100&forumid=202017&exp=0&select=1328631