Остановить перемещение курсора мыши по горизонтали, но по-прежнему требуется захват событий перемещения мыши

#c# #.net #winforms #events #cursor

#c# #.net #winforms #Мероприятия #курсор

Вопрос:

В моем приложении winforms у меня есть функция, которая открывает выпадающее меню, и вы перемещаете курсор влево или вправо, чтобы выбрать дополнительный параметр. Но я не хочу, чтобы курсор перемещался, я просто хочу, чтобы сами подпараметры перемещались влево или вправо (в зависимости от того, в каком направлении пытается двигаться мышь). Я надеюсь, что это имеет смысл для вас.

Кто-нибудь знает, как остановить перемещение курсора в определенном направлении, сохраняя при этом возможность фиксировать события перемещения мыши, пока пользователь «перемещает» мышь?

Любая помощь приветствуется, спасибо!

Ответ №1:

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

Комментарии:

1. Эта функция была запрошена моим клиентом.

2. Тогда ваша задача, как опытного разработчика, убедить его, что это очень плохая идея, почему это плохая идея, и представить несколько альтернатив, которые соответствуют лучшим практикам. Вы профессионал, вот почему они являются клиентом.

3. Я понимаю это и в какой-то степени согласен. Хотя, если отбросить «лучшие» практики, я действительно не понимаю, почему эта конкретная идея является плохой практикой. Я уже реализовал это, и мои мысли по этому поводу таковы: 1: Этого хочет клиент, 2: это выглядит действительно круто и хорошо сочетается с интерфейсом, 3: Это работает и 4: Требуется меньше движений руки для навигации по горизонтальному меню. Не могли бы вы объяснить, почему это плохая практика для этого? Я, очевидно, чего-то не хватает…

4. Во-первых, рад, что вам удалось добиться того, что вы хотите сделать. Что касается того, почему это плохая идея, ну, в основном потому, что мышь является частью общей операционной системы, а не только для вашего приложения. Ваше приложение не должно влиять на поведение глобальных объектов, поскольку оно предоставляет пользователю непоследовательный подход. Во-вторых, если ваше приложение завершило работу с ошибкой, и вы внедрили какое-либо подключение или ограничение для мыши, то это может повлиять на остальную часть операционной системы. Что касается того, чего хотят клиенты, я думаю, что это работа разработчика — консультировать и информировать, а также разрабатывать: clientsfromhell.net

Ответ №2:

Я не думаю, что вам вообще следует внедрять такое решение.

Но хорошо, вы могли бы вернуть положение курсора мыши в исходное положение в обработчике перемещения мыши. Но вы должны удалить обработчик, прежде чем возвращать положение и добавлять их снова после этого. Вы можете установить положение мыши с помощью PInvoke. Как это сделать, вы можете найти здесь http://pinvoke.net/default.aspx/user32.mouse_event

Комментарии:

1. Спасибо @DanielB.. Проверяю ссылку сейчас 🙂

Ответ №3:

Вы можете установить положение курсора вручную

     private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        Cursor.Position = new Point(400,400);
        Console.WriteLine("fired");
    }
  

Комментарии:

1. Спасибо, @Stecya, я действительно думал об этом, но, думаю, я просто подумал, что будет более … Не знаю, более правильный способ сделать это? Но опять же, я не понимаю, почему этот способ также не был бы правильным.. Спасибо 🙂

2. Это так просто? Почему я использовал PInvoke для этого всегда oO

3. Да 🙂 Но, может быть, в разных версиях Win OS это может быть не так просто??? Должна быть причина, по которой вам пришлось использовать PInvoke 🙂