Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Событие MouseMove в PictureBox запускается постоянно, даже если мышь не перемещается

Автор вопроса: Setyo NОтветов: 4

Почему кажется, что событие MouseMove для PictureBox запускается постоянно, даже если мышь не перемещается? Я пробовал следующие коды, чтобы доказать это (просто создав новую форму с PictureBox и меткой на ней).

private void pictureBox1_MouseMove ( object sender, MouseEventArgs e )
{
  label1.Text = DateTime.Now.ToLongTimeString ( ) + ": " + e.X + "," + e.Y;
}
  • Может быть ваша форма события mousemove зарегистрирует этот метод ?! Reza ArabQaeni 13.12.2011
  • Непрерывно, как в течение всего времени, в течение которого он работает, или только в течение определенного периода времени? События беспорядочные? (Если это так, подозревайте вибрацию и чрезмерно чувствительную мышь.) Ry-♦ 13.12.2011
  • Вы можете попробовать запустить Spy ++ и отслеживать сообщения Windows, чтобы попытаться увидеть, что еще происходит. Если у вас Visual Studio, в одной из папок инструментов должен быть spyxx.exe. Кроме того, попробуйте физически отключить мышь во время отладки и посмотрите, все ли вы получаете сообщения MouseMove. Trevor Elliott 13.12.2011
  • У меня есть возможность запустить те же коды на другом ПК, и он не может быть воспроизведен. Что-то должно быть не так с первым ПК. Я попробую использовать Spy ++, как предлагал Мохзе. Спасибо! Setyo N 13.12.2011
  • наклонный стол? напомни мне никогда не играть против тебя в покер :) Jeremy Thompson 13.12.2011

winformsmousemovepicturebox

Ответы

Ответ 1 · рейтинг 1 · RThomas

Первое предположение ... либо сейсмическая активность, либо нарглс - подозреваю, нарглс :).

Используя предоставленный вами образец кода, я не получаю такого же поведения. Мой ярлык обновляется, только если мышь действительно движется. (и для загрузки указатель должен находиться над окном изображения).

А если серьезно ... на вашем столе есть какие-то вибрации? Я мог бы также попробовать другую мышь - так как схема внутри может отправлять неверные данные.

Ответ 2 · рейтинг 5 · NiloCK

Некоторые методы, использующие формы окна, вызывают некоторый уровень внутреннего обновления формы, что (по моей оценке) заставляет форму "подбирать" позицию мыши и, таким образом, запускать событие MouseMove. Один из таких методов - связать всплывающую подсказку с формой. Как результат,

int moveCount = 0;
ToolTip toolTip = new ToolTip();
private void form1_MouseMove(object sender, MouseEventArgs e)
{
    Trace.WriteLine(moveCount);
    moveCount++;
    toolTip.SetToolTip(this, "Hello world");
}

будет срабатывать постоянно, даже если мышь не перемещается, в то время как

int moveCount = 0;
private void form1_MouseMove(object sender, MouseEventArgs e)
{
    Trace.WriteLine(moveCount);
    moveCount++;
}

срабатывает только тогда, когда мышь действительно перемещается.

Заглянув внутрь события MouseMove на предмет чего-то, что "глубоко" касается формы, может помочь выявить источник поведения цикла.

Ответ 3 · рейтинг 3 · Trevor Elliott

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

Дважды проверьте все ссылки на "pictureBox1_MouseMove", а также имейте в виду, что Windows запускает сообщения MouseMove при щелчке мыши, даже если вы не двигаете мышь.

В худшем случае вы можете сохранить точку e.Location в локальной переменной-члене ("oldLocation") и убедиться, что мышь действительно перемещается перед обработкой вашей команды:

private Point oldLocation = Point.Empty;

private void pictureBox1_MouseMove ( object sender, MouseEventArgs e )
{
    if (e.Location != oldLocation)
    {
        oldLocation = e.Location;

        label1.Text = DateTime.Now.ToLongTimeString ( ) + ": " + e.X + "," + e.Y;
    }
}

Ответ 4 · Christopher Smith

Наблюдение: если код обработчика события MouseMove изменяет размер элемента управления (явно или неявно в соответствии со свойством AutoSize) в любом направлении, обработчик события MouseMove будет повторно вызван, несмотря на отсутствие фактического движения мыши. Это может привести к возникновению порочного круга. Если ширина элемента управления с автоматическим изменением размера остается стабильной, несмотря на изменение его содержимого, обработчик MouseEvent не будет повторно вызван.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы