代码之家  ›  专栏  ›  技术社区  ›  esac

如何在按住鼠标的同时移动窗体?

  •  0
  • esac  · 技术社区  · 15 年前

    我有一个没有边框、标题栏、菜单等的窗口窗体。我希望用户能够按住ctrl键,左键单击窗体上的任何位置,然后拖动它,并移动它。知道怎么做吗?我试过这个,但它闪烁,很多:

        private void HiddenForm_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                this.SuspendLayout();
                Point xy = new Point(this.Location.X + (e.X - this.Location.X), this.Location.Y + (e.Y - this.Location.Y));
                this.Location = xy;
                this.ResumeLayout(true);
            }
        }
    
    1 回复  |  直到 15 年前
        1
  •  4
  •   RRUZ    15 年前

    试试这个

    using System.Runtime.InteropServices;
    
    const int HT_CAPTION = 0x2;
    const int WM_NCLBUTTONDOWN = 0xA1;
    
    [DllImportAttribute("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd,int Msg, int wParam, int lParam);
    [DllImportAttribute("user32.dll")]
    public static extern bool ReleaseCapture();    
    
    
    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
      if (e.Button == MouseButtons.Left)
      {
        ReleaseCapture();
        SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
      }
    }
    

    更新

    这个 ReleaseCapture ()函数从当前线程中的窗口释放鼠标捕获,并恢复正常的鼠标输入处理。捕获鼠标的窗口接收所有鼠标输入,而不考虑光标的位置,除非在光标热点位于另一线程的窗口中时单击鼠标按钮。

    这个 WM_NCLBUTTONDOWN 当鼠标左键单击窗口的非客户端区域时,消息将发送到窗口。wParam指定命中测试枚举值。我们传递htcaption,lparam指定光标位置,我们将其作为0传递,这样它就一定位于标题栏中。