Событие MouseMove в PictureBox происходит непрерывно, даже если мышь не перемещена - PullRequest
6 голосов
/ 13 декабря 2011

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

private void pictureBox1_MouseMove ( object sender, MouseEventArgs e )
{
  label1.Text = DateTime.Now.ToLongTimeString ( ) + ": " + e.X + "," + e.Y;
}

Ответы [ 3 ]

4 голосов
/ 20 декабря 2013

Некоторые методы, использующие формы Windows, вызывают некоторый уровень внутреннего обновления формы, что (по моей оценке) заставляет форму «подобрать» позицию мыши и, таким образом, запустить событие 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 голосов
/ 13 декабря 2011

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

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

В худшем случае вы можете сохранить Point 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;
    }
}
1 голос
/ 13 декабря 2011

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

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

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

...