【问题标题】:How to force release of mouse capture while moving a form in C#?如何在 C# 中移动表单时强制释放鼠标捕获?
【发布时间】:2014-03-25 15:27:51
【问题描述】:

C# .NET 4.0 WinForms

我遇到了表单拖动的异常情况。我需要以下行为:

  • 当用户单击窗体的 Windows 标题栏并将其拖到屏幕上时,一切都会正常响应。

  • 1234563而是用鼠标捕获和移动。拖动标记与精细的停靠系统一起使用,并提供有关停靠选项和选定放置目标的反馈。

问题:

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

【问题讨论】:

    标签: c# forms drag-and-drop mouse capture


    【解决方案1】:

    我想通了。 User32 库有一个 ReleaseCapture 方法,该方法将使鼠标松开当前正在拖动的任何窗体。

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

     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);
        }
    
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 感谢您的建议 Sten。我没有想过放弃窗框并自己画,这是一个有趣的想法。我还没有准备好走那么远,除非它是唯一的选择。我会把它作为备用计划。至于对接库,我使用的是 Krypton,但是我需要处理 Krypton 不支持的太多特殊情况,因此我构建了一个自定义方法,该方法对我的应用程序效果更好。应该有一种方法可以终止窗口拖动。有什么想法吗?
      猜你喜欢
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 2014-10-13
      • 1970-01-01
      • 2023-03-19
      • 2013-10-30
      • 2013-11-06
      相关资源
      最近更新 更多