使用P/Invoke实现不点击标题栏拖动窗体

现在许多程序(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 

你可能感兴趣的:(windows,qq,api,object,user)