仅在按下左键时捕获鼠标移动事件
本文关键字:鼠标 移动 事件 | 更新日期: 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