Событие MouseMove в PictureBox запускается постоянно, даже если мышь не перемещается
Автор вопроса: Setyo NОтветов: 4
Почему кажется, что событие MouseMove для PictureBox запускается постоянно, даже если мышь не перемещается? Я пробовал следующие коды, чтобы доказать это (просто создав новую форму с PictureBox и меткой на ней).
Может быть ваша форма события 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
Первое предположение ... либо сейсмическая активность, либо нарглс - подозреваю, нарглс :).
Используя предоставленный вами образец кода, я не получаю такого же поведения. Мой ярлык обновляется, только если мышь действительно движется. (и для загрузки указатель должен находиться над окном изображения).
А если серьезно ... на вашем столе есть какие-то вибрации? Я мог бы также попробовать другую мышь - так как схема внутри может отправлять неверные данные.
Ответ 2 · рейтинг 5 · NiloCK
Некоторые методы, использующие формы окна, вызывают некоторый уровень внутреннего обновления формы, что (по моей оценке) заставляет форму "подбирать" позицию мыши и, таким образом, запускать событие MouseMove. Один из таких методов - связать всплывающую подсказку с формой. Как результат,
срабатывает только тогда, когда мышь действительно перемещается.
Заглянув внутрь события MouseMove на предмет чего-то, что "глубоко" касается формы, может помочь выявить источник поведения цикла.
Ответ 3 · рейтинг 3 · Trevor Elliott
"pictureBox1_MouseMove" - это просто функция-делегат. Таким образом, с вашим кодом мы можем только предположить, что он был прикреплен к MouseMove и только MouseMove в дизайнере.
Дважды проверьте все ссылки на "pictureBox1_MouseMove", а также имейте в виду, что Windows запускает сообщения MouseMove при щелчке мыши, даже если вы не двигаете мышь.
В худшем случае вы можете сохранить точку e.Location в локальной переменной-члене ("oldLocation") и убедиться, что мышь действительно перемещается перед обработкой вашей команды:
Наблюдение: если код обработчика события MouseMove изменяет размер элемента управления (явно или неявно в соответствии со свойством AutoSize) в любом направлении, обработчик события MouseMove будет повторно вызван, несмотря на отсутствие фактического движения мыши. Это может привести к возникновению порочного круга. Если ширина элемента управления с автоматическим изменением размера остается стабильной, несмотря на изменение его содержимого, обработчик MouseEvent не будет повторно вызван.