如何在PictureBox上检测按住鼠标按钮?

我需要在鼠标位于PictureBox上方并且已经单击并按住鼠标按钮时触发事件。

问题:

MouseDown和MouseEnter事件处理程序不能很好地协同工作。

例如,一旦点击并按住鼠标按钮,C#将触发MouseDown事件处理程序,但是当光标移动到PictureBox上时,MouseEnter事件不会触发,直到鼠标按钮被释放。

按下鼠标时,大多数控件将控制。 捕捉鼠标输入。 这意味着所有MouseMove事件都被发送到捕获的原始控件而不是鼠标碰巧结束的控件。 这一直持续到鼠标失去捕获,这通常发生在鼠标上。

如果你真的需要知道鼠标何时在你的控制之上,即使另一个控件已经捕获了鼠标输入,那么你只有一种方法。 您需要窥探发往应用程序内其他控件的Windows消息。 为此,您需要添加消息filter…

Application.AddMessageFilter(myFilterClassInstance); 

然后你需要在合适的类上实现IMessageFilter ……

 public class MyFilterClass : IMessageFilter { public bool PreFilterMessage(ref Message m) { if (m.Msg == WM_MOUSEMOVE) // Check if mouse is over my picture box! return false; } } 

然后你会观察鼠标移动事件并检查它们是否在你的图片框上,并做你想做的任何事情。

鼠标事件

使用MouseDown事件只检测向下按下鼠标按钮并将this.Capture设置为true,这样您就可以获得其他鼠标事件,即使鼠标离开控件也是如此(即您捕获时不会获得MouseLeave事件老鼠)。 当MouseUp发生时,通过将this.Capture设置为false来释放捕获。

只需检查鼠标的状态

这可能不相关,但您可以检查System.Windows.Control.MousePosition并查看它是否在PictureBox.ClientRectangle ,然后检查Control.MouseButtons静态属性,可以随时关闭哪些按钮。

如:

 if (pictureBox.ClientRectangle.Contains(pictureBox.PointToClient(Control.MousePosition))) { if ((Control.MouseButtons & MouseButtons.Left) != 0) { // Left button is down. } } 

在PictureBox控件中设置MouseMove事件:

 this.myPictureBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.myPictureBox_MouseMove); 

然后,在MouseMove事件处理程序中,检查是否按下了鼠标左键(或其他):

 private void myPictureBox_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) // Do what you want to do } 

如果您正在尝试实现某种类型的拖放操作,则接收图片框上的拖动…事件 (DragEnter,DragDrop等)就是您要使用的。 基本上,您使用源代码管理的DoDragDrop方法启动拖动操作,然后您拖动的任何控件都会引发其Drag …事件。

在MSDN上搜索“DoDragDrop”以了解如何实现此function。

基于鼠标位置和控制相对位置移动表单的最佳方式类似于Ian Campbell发布的内容。

  private void imgMoveWindow_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { Form1.ActiveForm.Left = Control.MousePosition.X - imgMoveWindow.Left - (imgMoveWindow.Size.Width/2); Form1.ActiveForm.Top = Control.MousePosition.Y - imgMoveWindow.Top - (imgMoveWindow.Size.Height/2); } } 

其中imgMoveWindow是PictureBox控件。

布鲁诺拉特尼克斯

嗅探器网络

鼠标按下时设置标志或状态。 在鼠标上释放它。 当鼠标hover在图片框的火上时,请检查您的状态。 现在,您可以检测到某人拖动某物的时间。