如何在c#中移动窗体时强制释放鼠标捕获
本文关键字:释放 鼠标 窗体 移动 | 更新日期: 2023-09-27 17:53:00
c# .NET 4.0 WinForms
我有一个不寻常的情况与窗体拖动。我需要以下行为:
-
当用户点击窗体的Windows标题栏并在屏幕上拖动它时,一切都正常响应。
-
如果用户在通过Windows标题栏拖动窗体时按住Ctrl键,则窗口将被删除并隐藏,创建一个特殊的拖动标记(不同的迷你窗体),并且拖动标记将被捕获并使用鼠标移动。拖拽令牌与一个精心设计的停靠系统一起使用,并提供关于停靠选项和选定的放置目标的反馈。
问题:
如果按下Ctrl键,如何通过编程方式释放窗体拖动过程中的鼠标捕获,以便我可以隐藏它并启动另一个窗体的捕获?
我明白了。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
}