仅在按下左键时捕获鼠标移动事件

本文关键字:鼠标 移动 事件 | 更新日期: 2023-09-27 18:12:47

我只需要在鼠标按下鼠标左键移动到控件上时更新控件。我通常会简单地检查e.Button属性,但它在MouseEnter事件中不可用。

void MyControl_MouseEnter(object sender, EventArgs e)
    {
        // MouseEventArgs needed to check this
        // if (e.Button == MouseButtons.Left)
        // {
        //     update MyControl
        // }
    }

你将如何做到这一点?

仅在按下左键时捕获鼠标移动事件

使用静态控件。MouseButtons财产。例如:

    private void panel1_MouseEnter(object sender, EventArgs e) {
        if (Control.MouseButtons == MouseButtons.Left) {
            // etc...
        }
    }

这是非常难以进行的,无论用户点击什么来按下鼠标按钮都将捕获鼠标,从而阻止控件的MouseEnter事件触发。这也是用户完全无法发现的UI。请考虑使用更好的捕鼠器。

这是一种(粗略的)方法。它将把表单的标题文本更改为当您将鼠标拖动到button1上时所按下的任何鼠标按钮。您可以参考Control.MouseButtons查看哪个按钮处于按下状态。以下是MSDN上的更多信息。

 public partial class Form1 : Form
    {
        MouseButtons _buttons;
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_MouseMove(object sender, MouseEventArgs e)
        {
            if (_buttons != System.Windows.Forms.MouseButtons.None)
            {
                this.Text = _buttons.ToString();
            }
        }
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            _buttons = Control.MouseButtons;
        }
    }

我在SO上的另一个问题中找到了答案:

如何检测在图片框上按下的鼠标按钮?

您将需要使用消息过滤器。实现IMessageFilter接口的PreFilterMessage,并使用Application.AddMessageFilter分配实例

你必须自己解释windows消息…这并不难,但需要一些工作。

实现可能像这样:

        if (m.Msg == 0x200)
        {
            int x, y;
            x = m.LParam.ToInt32() & 0xFFFF;
            y = m.LParam.ToInt32() >> 16;
            if ((m.WParam.ToInt32() & 2) != 0)
            {
                // here, the left mouse button is pressed, and you can use the coords
                // and see if the mouse is over the control you want.
            }
        }

我今天刚刚实现了这样的东西,只在Chrome中测试,但工作得相当好。基本的概念是,您只捕获mousedown和mouseup之间的鼠标移动,如下所示:

var image = document.getElementById('my_image');
image.addEventListener('mousedown', function(e) {
    e.currentTarget.addEventListener('mousemove', doMyStuff);
});
image.addEventListener('mouseup', function(e) {
    e.currentTarget.removeEventListener('mousemove', doMyStuff);
});
function doMyStuff(e) {
    // do what you want, the mouse is moving while the user is holding the button down
}
   Private Sub Button1_MouseDown(sender As Object, e As MouseEventArgs) Handles 
        Button1.MouseDown
        If Control.MouseButtons = MouseButtons.Left Then
            Label1.Text = "Left"
        ElseIf Control.MouseButtons = MouseButtons.Right Then
            Label1.Text = "Right"
        ElseIf Control.MouseButtons = MouseButtons.Middle Then
            Label1.Text = "Middle"
        Else
            Label1.Text = "lelse"
        End If
    End Sub