如何在c#中移动窗体时强制释放鼠标捕获

本文关键字:释放 鼠标 窗体 移动 | 更新日期: 2023-09-27 17:53:00

c# .NET 4.0 WinForms

我有一个不寻常的情况与窗体拖动。我需要以下行为:

  • 当用户点击窗体的Windows标题栏并在屏幕上拖动它时,一切都正常响应。

  • 如果用户在通过Windows标题栏拖动窗体时按住Ctrl键,则窗口将被删除并隐藏,创建一个特殊的拖动标记(不同的迷你窗体),并且拖动标记将被捕获并使用鼠标移动。拖拽令牌与一个精心设计的停靠系统一起使用,并提供关于停靠选项和选定的放置目标的反馈。

问题:

如果按下Ctrl键,如何通过编程方式释放窗体拖动过程中的鼠标捕获,以便我可以隐藏它并启动另一个窗体的捕获?

如何在c#中移动窗体时强制释放鼠标捕获

我明白了。User32库有一个ReleaseCapture方法,它会使鼠标放开当前正在拖动的任何窗体。

下面的例子显示了当用户按下Ctrl键时如何取消窗体拖动:

 public static class User32_DLL
{
    [DllImportAttribute("user32.dll")]
    public static extern bool ReleaseCapture();
}

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.SetStyle(ControlStyles.EnableNotifyMessage, true);
    }

    protected override void OnNotifyMessage(Message m)
    {
        const int WM_MOVING = 0x0216;
        if (m.Msg == WM_MOVING)
        {
            if (Control.ModifierKeys == Keys.Control)
            {
                User32_DLL.ReleaseCapture();
            }
        }
        base.OnNotifyMessage(m);
    }
}

首先考虑你是否需要重新发明轮子。有几个对接库。

如果你仍然无法抗拒这种冲动,你可以放弃标准的窗口框架,并绘制自己的窗口框架,并以自定义的方式处理窗口拖动事件:

if (Keyboard.CTRL){
  CustomDrag();
} else {
  this.DragMove(); //Window.DragMove() calls the OS to start dragging the window
}