3

我有一种情况,我想通过在其客户区域上按住鼠标右键来移动 Windows 窗体;正如我所说的那样,它是无边界的。

我想“本机”移动它(如果可能,其他答案也可以)。我的意思是当你在标题栏上按住鼠标左键时它的行为方式(鼠标移动和类似的事情我得到了很多奇怪的行为,但也许只是我)。

我已经阅读了很多东西,这篇文章看起来很有帮助

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/b9985b19-cab5-4fba-9dc5-f323d0d37e2f/

我尝试了各种使用它的方法,并通过http://msdn.microsoft.com/en-us/library/ff468877%28v=VS.85%29.aspx观看以找到其他有用的东西,但是我想到了 WM_NCRBUTTONDOWN wndproc 没有检测到它,可能是因为它是由表单处理的?

任何建议表示赞赏,谢谢

弗朗切斯科

4

2 回答 2

5
public partial class DragForm : Form
{
    // Offset from upper left of form where mouse grabbed
    private Size? _mouseGrabOffset;

    public DragForm()
    {
        InitializeComponent();
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        if( e.Button == System.Windows.Forms.MouseButtons.Right )
            _mouseGrabOffset = new Size(e.Location);

        base.OnMouseDown(e);
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        _mouseGrabOffset = null;

        base.OnMouseUp(e);
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        if (_mouseGrabOffset.HasValue)
        {
            this.Location = Cursor.Position - _mouseGrabOffset.Value;
        }

        base.OnMouseMove(e);
    }
}
于 2011-05-07T04:51:46.423 回答
1

您需要两个 P/Invoke 方法来完成这项工作。

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd, int msg, int wparam, int lparam);

[DllImport("user32.dll")]
static extern bool ReleaseCapture();

几个常数:

const int WmNcLButtonDown = 0xA1;
const int HtCaption= 2;

处理MouseDown表单上的事件,然后执行以下操作:

private void Form_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        ReleaseCapture();
        SendMessage(this.Handle, WmNcLButtonDown, HtCaption, 0);
    }
}

当鼠标单击并按住标题区域时,这将向您的表单发送相同的事件。移动鼠标,窗口就会移动。当您松开鼠标按钮时,移动停止。好简单。

于 2011-04-29T02:54:05.497 回答