Как я могу обнаружить нажатую кнопку мыши над PictureBox?

Мне нужно запустить событие, когда мышь находится над PictureBox с нажатой кнопкой мыши и удерживается нажатой.

Проблемы:

Обработчики событий MouseDown и MouseEnter работают не очень хорошо.

Например, когда нажата кнопка мыши и удерживается нажатой кнопка С#, загорается обработчик события MouseDown, но когда курсор перемещается над PictureBox, событие MouseEnter не срабатывает, пока кнопка мыши не будет показана.

Ответ 1

Когда мышь нажата, большинство элементов управления будет Control.Capture ввода мыши. Это означает, что все события MouseMove отправляются в исходный элемент управления, который был захвачен, а не на управление, которое мышь закончила. Это продолжается до тех пор, пока мышь не потеряет захват, который обычно происходит с помощью мыши.

Если вам действительно нужно знать, когда мышь находится над вашим контролем, даже когда другой элемент управления захватил ввод мыши, тогда вы действительно имеете только один способ. Вам нужно отследить сообщения Windows, предназначенные для других элементов управления внутри вашего приложения. Для этого вам нужно добавить фильтр сообщений...

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;
    }
}

Затем вы смотрите на события перемещения мыши и проверяете, находятся ли они над полем изображения и делают то, что вы хотите сделать.

Ответ 2

События мыши

Используйте событие MouseDown, чтобы просто определить нажатие кнопки мыши нажатием кнопки вниз и установить this.Capture в true, чтобы затем получить другие события мыши, даже когда мышь покидает элемент управления (т.е. вы не получите событие MouseLeave потому что вы захватили мышь). Освободите захват, установив this.Capture на false, когда MouseUp происходит.

Просто проверить состояние мыши

Это может быть не актуально, но вы можете проверить 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.
   }
}

Ответ 3

Настройте событие MouseMove в элементе управления PictureBox:

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
}

Ответ 4

Если вы пытаетесь выполнить какую-то операцию перетаскивания, Перетащите... события (DragEnter, DragDrop и т.д.) на поле получаемого изображения - это то, что вы хотите использовать. В принципе, вы запускаете операцию перетаскивания с помощью метода DoDragDrop для элемента управления source, а затем любой элемент управления, который вы перетаскиваете, будет иметь связанные с ним события Drag....

Найдите "DoDragDrop" в MSDN, чтобы узнать, как это реализовать.

Ответ 5

Лучший способ переместить форму на основе положения мыши и относительного положения управления аналогичен тому, что опубликовал Иэн Кэмпбелл.

    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.

Бруно Ратниекс

Sniffer Networks

Ответ 6

установите флаг или состояние с мыши вниз. отпустите его на мышку. Когда на мыши над огнями для окна изображения проверьте свое состояние. Теперь вы можете обнаружить, когда человек что-то перетаскивает.