C#实现无标题栏拖动窗体地方法(API)


调用API消息
        [DllImport(“user32.dll”)]
        public extern static long SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
        public const int WM_SYSCOMMAND = 0x0112;
        [DllImport(“user32.dll”)]
        public extern static bool ReleaseCapture();
鼠标事件
                this.Opacity = 0.2;
                ReleaseCapture();
                SendMessage(this.Handle, WM_SYSCOMMAND, 0xF017, 0);


调用API消息
        [DllImport(“user32.dll”)]
        public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wparam, int lparam);
重写的鼠标事件
        protected override voidonMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e); if (e.Button == MouseButtons.Left)//按下的是鼠标左键  
            {
                Capture = false;//释放鼠标,使能够手动***作         
                SendMessage(Handle, 0x00A1, 2, 0);//拖动窗体     
            }
        }


公用定量
private const int WM_NCHITTEST = 0x84;
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;

鼠标重写

protected override void WndProc(ref Message m)
{
       switch(m.Msg)
      {
            case WM_NCHITTEST:
                      base.WndProc(ref m);
                      if ((int)m.Result == HTCLIENT)
                             m.Result = (IntPtr)HTCAPTION;
                             return;
                             break;
    }
    base.WndProc(ref m);
}


重写鼠标事件

protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case 0x0201://鼠标左键按下的消息
                    m.Msg = 0x00A1;//更改消息为非客户区按下鼠标
                    m.LParam = IntPtr.Zero;//默认值
                    m.WParam = new IntPtr(2);//鼠标放在标题栏内
                    break;
            }
            base.WndProc(ref m);
        }



本文固定链接: http://www.ntxz.net/?p=506 | 周忞 | 吉心的记事本



该日志由 吉心 于2009年12月07日发表在 懒得分类, 旧版博客 分类下, 你可以发表评论
在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: C#实现无标题栏拖动窗体地方法(API) | 周忞 | 吉心的记事本

C#实现无标题栏拖动窗体地方法(API):等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!